{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Imports and data\n",
    "The libraries used in this notebook are available by calling `pipenv install --dev` in the top-level of the repository.\n",
    "Once installed, you can call `pipenv run jupyter-notebook` to open your Jupyter workspace, navigate to `examples/swifter_speed_comparison.ipynb` and run the cells."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:54:46.667227Z",
     "start_time": "2020-08-03T23:54:45.013118Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import dask.dataframe as dd\n",
    "import swifter\n",
    "import perfplot\n",
    "import matplotlib.pyplot as plt\n",
    "import psutil"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:54:46.671816Z",
     "start_time": "2020-08-03T23:54:46.669298Z"
    }
   },
   "outputs": [],
   "source": [
    "ncores = psutil.cpu_count()\n",
    "npartitions = ncores*2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "These data (~71 million rows) were taken from https://www.kaggle.com/benhamner/sf-bay-area-bike-share/data.\n",
    "In order to run the speed comparisons in this notebook yourself, you will need to download the data from that location, and unzip the file into the the `examples` directory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:54:58.848056Z",
     "start_time": "2020-08-03T23:54:46.674387Z"
    }
   },
   "outputs": [],
   "source": [
    "data = pd.read_feather(\"../../swifter_data/data/status\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:51:42.228282Z",
     "start_time": "2020-08-03T18:51:05.192225Z"
    }
   },
   "outputs": [],
   "source": [
    "data = pd.read_csv('status.csv')\n",
    "data['date'] = pd.to_datetime(data['time'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:51:42.251007Z",
     "start_time": "2020-08-03T18:51:42.230852Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(71984434, 5)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>station_id</th>\n",
       "      <th>bikes_available</th>\n",
       "      <th>docks_available</th>\n",
       "      <th>time</th>\n",
       "      <th>date</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>25</td>\n",
       "      <td>2013/08/29 12:06:01</td>\n",
       "      <td>2013-08-29 12:06:01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>25</td>\n",
       "      <td>2013/08/29 12:07:01</td>\n",
       "      <td>2013-08-29 12:07:01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>25</td>\n",
       "      <td>2013/08/29 12:08:01</td>\n",
       "      <td>2013-08-29 12:08:01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>25</td>\n",
       "      <td>2013/08/29 12:09:01</td>\n",
       "      <td>2013-08-29 12:09:01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>25</td>\n",
       "      <td>2013/08/29 12:10:01</td>\n",
       "      <td>2013-08-29 12:10:01</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   station_id  bikes_available  docks_available                 time  \\\n",
       "0           2                2               25  2013/08/29 12:06:01   \n",
       "1           2                2               25  2013/08/29 12:07:01   \n",
       "2           2                2               25  2013/08/29 12:08:01   \n",
       "3           2                2               25  2013/08/29 12:09:01   \n",
       "4           2                2               25  2013/08/29 12:10:01   \n",
       "\n",
       "                 date  \n",
       "0 2013-08-29 12:06:01  \n",
       "1 2013-08-29 12:07:01  \n",
       "2 2013-08-29 12:08:01  \n",
       "3 2013-08-29 12:09:01  \n",
       "4 2013-08-29 12:10:01  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(data.shape)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Function Definitions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vectorized function\n",
    "This function doesn't contain any control-flow logic e.g. if/else and is simply a numeric computation.\n",
    "\n",
    "\n",
    "As such, we can call it in a vectorized fashion e.g. `bikes_proportion(df[\"bikes_available\"], max_x=np.max(data[\"bikes_available\"]))`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T19:52:54.036930Z",
     "start_time": "2020-03-28T19:52:54.034241Z"
    }
   },
   "outputs": [],
   "source": [
    "def bikes_proportion(x, max_x):\n",
    "    return x * 1.0 / max_x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Non-vectorized function\n",
    "This function does contain a control-flow logic e.g. if/else and therefore cannot be called in a vectorized sense.\n",
    "\n",
    "As such, we can't include the vectorized comparison in our perfplot."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T19:52:54.044584Z",
     "start_time": "2020-03-28T19:52:54.039478Z"
    }
   },
   "outputs": [],
   "source": [
    "def is_morning(datetime):\n",
    "    if (datetime.hour >= 6) and (datetime.hour < 12):\n",
    "        return True\n",
    "    else:\n",
    "        return False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Non-vectorized string functions\n",
    "This function performs an operation on a string column."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:55:06.051305Z",
     "start_time": "2020-08-03T23:55:06.048171Z"
    }
   },
   "outputs": [],
   "source": [
    "def display_information(row):\n",
    "    return f\"Station ID {row['station_id']} had {row['bikes_available']} bikes available at {row['time']}. This is {np.where(row['bikes_available'] > row['docks_available'], 'more', 'less')} than the number of docks available ({row['docks_available']}).\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group By Apply aggregation functions\n",
    "This function performs a group by operation on numeric columns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def agg_func(x):\n",
    "    return x[\"normal\"].mean() / x[\"exponential\"].var()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group By Apply text functions\n",
    "This function performs a group by operation on string columns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def join_text_func(x):\n",
    "    return \" \".join([name for name in x[\"first\"].values.tolist() + x[\"last\"].values.tolist()])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Perfplot\n",
    "[Perfplot](https://github.com/unutbu/perfplot) is a library for performing speed comparisons of various functions.\n",
    "\n",
    "Here we use perfplot to compare pandas apply, dask apply, vectorized functions, and swifter apply."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vectorized function speed comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T20:07:57.268051Z",
     "start_time": "2020-03-28T19:52:54.046772Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/14 [00:00<?, ?it/s]\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.10s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.11s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.11s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.11s/it]\u001b[A\n",
      "  7%|▋         | 1/14 [00:04<00:59,  4.55s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.10s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.10s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.10s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.10s/it]\u001b[A\n",
      " 14%|█▍        | 2/14 [00:09<00:54,  4.53s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.10s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.11s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.11s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.11s/it]\u001b[A\n",
      " 21%|██▏       | 3/14 [00:13<00:49,  4.53s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.11s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.13s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.12s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.12s/it]\u001b[A\n",
      " 29%|██▊       | 4/14 [00:18<00:45,  4.55s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.12s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.12s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.12s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.12s/it]\u001b[A\n",
      " 36%|███▌      | 5/14 [00:22<00:40,  4.55s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.09s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.10s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.10s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.11s/it]\u001b[A\n",
      " 43%|████▎     | 6/14 [00:27<00:36,  4.55s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.17s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.16s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.14s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.14s/it]\u001b[A\n",
      " 50%|█████     | 7/14 [00:31<00:32,  4.57s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.22s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.20s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.17s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.16s/it]\u001b[A\n",
      " 57%|█████▋    | 8/14 [00:36<00:27,  4.63s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:04,  1.49s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.39s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.31s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.26s/it]\u001b[A\n",
      " 64%|██████▍   | 9/14 [00:41<00:24,  4.83s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:03<00:11,  3.73s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:04<00:05,  2.95s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:05<00:02,  2.40s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:07<00:00,  2.02s/it]\u001b[A\n",
      " 71%|███████▏  | 10/14 [00:50<00:23,  5.88s/it]A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:14<00:42, 14.01s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:15<00:20, 10.15s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:16<00:07,  7.45s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:17<00:00,  5.57s/it]\u001b[A\n",
      " 79%|███████▊  | 11/14 [01:12<00:32, 10.76s/it]A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:55<02:46, 55.41s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:56<01:18, 39.17s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:57<00:27, 27.77s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:59<00:00, 19.79s/it]\u001b[A\n",
      " 86%|████████▌ | 12/14 [02:29<01:01, 30.79s/it]A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [03:39<10:58, 219.51s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [03:41<05:08, 154.19s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [03:42<01:48, 108.36s/it]\u001b[A\n",
      "100%|██████████| 4/4 [03:44<00:00, 76.27s/it] \u001b[A\n",
      " 93%|█████████▎| 13/14 [07:27<01:50, 110.80s/it]\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [14:40<44:02, 880.91s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [14:44<20:35, 617.82s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [14:46<07:13, 433.05s/it]\u001b[A\n",
      "100%|██████████| 4/4 [14:48<00:00, 222.17s/it]\u001b[A\n",
      "100%|██████████| 14/14 [27:10<00:00, 116.48s/it]\n"
     ]
    }
   ],
   "source": [
    "vectorized_comparison = perfplot.bench(\n",
    "    setup=lambda n: data.loc[:n, 'bikes_available'],\n",
    "    kernels=[\n",
    "        lambda df: df.apply(bikes_proportion, max_x=np.max(data['bikes_available'])),\n",
    "        lambda df: dd.from_pandas(df, npartitions=npartitions).map_partitions(bikes_proportion, max_x=np.max(data['bikes_available']), meta=('f8')).compute(scheduler='threads'),\n",
    "        lambda df: bikes_proportion(df, max_x=np.max(data['bikes_available'])),\n",
    "        lambda df: df.swifter.progress_bar(False).apply(bikes_proportion, max_x=np.max(data['bikes_available']))\n",
    "    ],\n",
    "    labels=['Pandas Apply', 'Dask Apply', 'Vectorized Function', 'Swifter Apply'],\n",
    "    n_range=[2**k for k in range(0, 28, 2)],\n",
    "    xlabel='n_rows'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T20:07:58.024441Z",
     "start_time": "2020-03-28T20:07:57.274743Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "vectorized_comparison.title = \"Vectorized Function Speed Comparison\"\n",
    "vectorized_comparison.xlabel = \"n_rows\"\n",
    "vectorized_comparison.plot(logx=False, logy=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T20:07:58.692724Z",
     "start_time": "2020-03-28T20:07:58.025838Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Runtime [log10(s)]')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "vectorized_comparison.xlabel = 'log10(n_rows)'\n",
    "vectorized_comparison.title = 'Vectorized Function Speed Comparison [LogLog Plot]'\n",
    "vectorized_comparison.plot(logx=True, logy=True, time_unit='s')\n",
    "plt.ylabel(\"Runtime [log10(s)]\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Non-vectorized function speed comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T20:09:57.997221Z",
     "start_time": "2020-03-28T20:08:52.774840Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/14 [00:00<?, ?it/s]\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:00<00:01,  1.51it/s]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.02s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.04s/it]\u001b[A\n",
      "  7%|▋         | 1/14 [00:03<00:46,  3.60s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:00<00:01,  1.23it/s]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.13s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.10s/it]\u001b[A\n",
      " 14%|█▍        | 2/14 [00:07<00:43,  3.63s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:00<00:01,  1.22it/s]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.02s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.01it/s]\u001b[A\n",
      " 21%|██▏       | 3/14 [00:10<00:38,  3.52s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:00<00:01,  1.29it/s]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:00,  1.00it/s]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.04it/s]\u001b[A\n",
      " 29%|██▊       | 4/14 [00:13<00:34,  3.41s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:00<00:01,  1.06it/s]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.13s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.12s/it]\u001b[A\n",
      " 36%|███▌      | 5/14 [00:17<00:31,  3.47s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:01<00:02,  1.00s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.16s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.13s/it]\u001b[A\n",
      " 43%|████▎     | 6/14 [00:20<00:28,  3.51s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:00<00:01,  1.00it/s]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.16s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.12s/it]\u001b[A\n",
      " 50%|█████     | 7/14 [00:24<00:24,  3.53s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:01<00:02,  1.13s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:02<00:01,  1.26s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:03<00:00,  1.24s/it]\u001b[A\n",
      " 57%|█████▋    | 8/14 [00:28<00:21,  3.66s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:01<00:02,  1.41s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:03<00:01,  1.51s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:04<00:00,  1.55s/it]\u001b[A\n",
      " 64%|██████▍   | 9/14 [00:33<00:20,  4.10s/it][A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:03<00:06,  3.36s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:05<00:03,  3.03s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:09<00:00,  3.32s/it]\u001b[A\n",
      " 71%|███████▏  | 10/14 [00:44<00:24,  6.09s/it]A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:14<00:28, 14.07s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [00:18<00:11, 11.22s/it]\u001b[A\n",
      "100%|██████████| 3/3 [00:25<00:00,  9.81s/it]\u001b[A\n",
      " 79%|███████▊  | 11/14 [01:14<00:39, 13.18s/it]A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [00:57<01:54, 57.25s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [01:10<00:44, 44.18s/it]\u001b[A\n",
      "100%|██████████| 3/3 [01:28<00:00, 36.05s/it]\u001b[A\n",
      " 86%|████████▌ | 12/14 [03:01<01:23, 41.55s/it]A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [03:44<07:29, 224.87s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [04:35<02:52, 172.49s/it]\u001b[A\n",
      "100%|██████████| 3/3 [05:33<00:00, 138.36s/it]\u001b[A\n",
      " 93%|█████████▎| 13/14 [09:54<02:32, 152.89s/it]A\n",
      "  0%|          | 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33%|███▎      | 1/3 [15:01<30:02, 901.43s/it]\u001b[A\n",
      " 67%|██████▋   | 2/3 [18:18<11:30, 690.11s/it]\u001b[A\n",
      "100%|██████████| 3/3 [22:04<00:00, 441.40s/it]\u001b[A\n",
      "100%|██████████| 14/14 [37:08<00:00, 159.20s/it]\n"
     ]
    }
   ],
   "source": [
    "nonvectorized_comparison = perfplot.bench(\n",
    "    setup=lambda n: data.loc[:n, 'date'],\n",
    "    kernels=[\n",
    "        lambda df: df.apply(is_morning),\n",
    "        lambda df: dd.from_pandas(df, npartitions=npartitions).apply(is_morning, meta=(bool)).compute(scheduler='processes'),\n",
    "        lambda df: df.swifter.progress_bar(False).apply(is_morning)\n",
    "    ],\n",
    "    labels=['Pandas Apply', 'Dask Apply', 'Swifter Apply'],\n",
    "    n_range=[2**k for k in range(0, 28, 2)],\n",
    "    xlabel='n_rows'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T20:09:58.526386Z",
     "start_time": "2020-03-28T20:09:58.000854Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "nonvectorized_comparison.title = \"Non-Vectorized Function Speed Comparison\"\n",
    "nonvectorized_comparison.xlabel = \"n_rows\"\n",
    "nonvectorized_comparison.plot(logx=False, logy=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-28T20:09:59.807236Z",
     "start_time": "2020-03-28T20:09:58.575141Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Runtime [log10(s)]')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "nonvectorized_comparison.xlabel = 'log10(n_rows)'\n",
    "nonvectorized_comparison.title = 'Non-Vectorized Function Speed Comparison [LogLog Plot]'\n",
    "nonvectorized_comparison.plot(logx=True, logy=True, time_unit='s')\n",
    "plt.ylabel(\"Runtime [log10(s)]\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Non-vectorized string function speed comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:49:36.208809Z",
     "start_time": "2020-08-03T23:49:36.205235Z"
    }
   },
   "outputs": [],
   "source": [
    "def clean_text(text_row):\n",
    "    text = text_row[\"text\"].strip()\n",
    "    text = text.replace(' ', '_')\n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:48:38.206788Z",
     "start_time": "2020-08-03T23:48:33.163487Z"
    }
   },
   "outputs": [],
   "source": [
    "N_rows = 70000000\n",
    "df_data = pd.DataFrame([[\"i want to break free\"]] * N_rows, columns=[\"text\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:18:27.756468Z",
     "start_time": "2020-08-03T23:14:55.289683Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/14 [00:00<?, ?it/s]\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:00<00:02,  1.41it/s]\u001b[A\n",
      " 50%|█████     | 2/4 [00:01<00:01,  1.20it/s]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:02<00:00,  1.21it/s]\u001b[A\n",
      "100%|██████████| 4/4 [00:03<00:00,  1.13it/s]\u001b[A\n",
      "  7%|▋         | 1/14 [00:03<00:47,  3.67s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:00<00:02,  1.11it/s]\u001b[A\n",
      " 50%|█████     | 2/4 [00:01<00:01,  1.06it/s]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:02<00:00,  1.13it/s]\u001b[A\n",
      "100%|██████████| 4/4 [00:03<00:00,  1.17it/s]\u001b[A\n",
      " 14%|█▍        | 2/14 [00:07<00:43,  3.62s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:00<00:02,  1.08it/s]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.04s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:00,  1.02it/s]\u001b[A\n",
      "100%|██████████| 4/4 [00:03<00:00,  1.07it/s]\u001b[A\n",
      " 21%|██▏       | 3/14 [00:11<00:40,  3.70s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:00<00:02,  1.14it/s]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.01s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:02<00:00,  1.15it/s]\u001b[A\n",
      "100%|██████████| 4/4 [00:03<00:00,  1.09it/s]\u001b[A\n",
      " 29%|██▊       | 4/14 [00:14<00:37,  3.73s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:00<00:02,  1.11it/s]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:01,  1.00it/s]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:02<00:00,  1.10it/s]\u001b[A\n",
      "100%|██████████| 4/4 [00:03<00:00,  1.08it/s]\u001b[A\n",
      " 36%|███▌      | 5/14 [00:18<00:33,  3.75s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.00s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.09s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.10s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.12s/it]\u001b[A\n",
      " 43%|████▎     | 6/14 [00:23<00:32,  4.01s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:03,  1.12s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:02<00:02,  1.21s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:03<00:01,  1.21s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:04<00:00,  1.20s/it]\u001b[A\n",
      " 50%|█████     | 7/14 [00:28<00:30,  4.33s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:01<00:05,  1.94s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:03<00:03,  1.75s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:04<00:01,  1.74s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:06<00:00,  1.74s/it]\u001b[A\n",
      " 57%|█████▋    | 8/14 [00:35<00:31,  5.19s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:05<00:17,  5.95s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:07<00:09,  4.77s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:10<00:04,  4.21s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:13<00:00,  3.65s/it]\u001b[A\n",
      " 64%|██████▍   | 9/14 [00:50<00:40,  8.18s/it][A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A\n",
      " 25%|██▌       | 1/4 [00:23<01:09, 23.31s/it]\u001b[A\n",
      " 50%|█████     | 2/4 [00:30<00:37, 18.50s/it]\u001b[A\n",
      " 75%|███████▌  | 3/4 [00:38<00:15, 15.37s/it]\u001b[A\n",
      "100%|██████████| 4/4 [00:45<00:00, 12.81s/it]\u001b[A\n",
      " 71%|███████▏  | 10/14 [01:44<01:26, 21.72s/it]A\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]\u001b[A"
     ]
    }
   ],
   "source": [
    "nonvectorized_string_comparison = perfplot.bench(\n",
    "    setup=lambda n: data.loc[:n],\n",
    "    kernels=[\n",
    "        lambda df: df.apply(display_information, axis=1),\n",
    "        lambda df: dd.from_pandas(df, npartitions=npartitions).apply(display_information, axis=1, meta=(str)).compute(scheduler='processes'),\n",
    "        lambda df: df.swifter.progress_bar(False).allow_dask_on_strings(True).apply(display_information, axis=1),\n",
    "        lambda df: df.swifter.progress_bar(False).allow_dask_on_strings(False).apply(display_information, axis=1),\n",
    "    ],\n",
    "    labels=['Pandas Apply', 'Dask Apply', 'Swifter Dask Apply', 'Swifter Modin Apply'],\n",
    "    n_range=[2**k for k in range(0, 28, 2)],\n",
    "    xlabel='n_rows',\n",
    "    equality_check=lambda left, right: left.equals(right)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:08:51.093332Z",
     "start_time": "2020-08-03T23:08:50.295289Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "nonvectorized_string_comparison.title = \"Non-Vectorized String Function Speed Comparison\"\n",
    "nonvectorized_string_comparison.xlabel = \"n_rows\"\n",
    "nonvectorized_string_comparison.plot(logx=False, logy=False)\n",
    "plt.savefig(\"nonvectorized_string_axis1_speed_comparison.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T23:08:52.508637Z",
     "start_time": "2020-08-03T23:08:51.095850Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "nonvectorized_string_comparison.xlabel = 'log10(n_rows)'\n",
    "nonvectorized_string_comparison.title = 'Non-Vectorized String Function Speed Comparison [LogLog Plot]'\n",
    "nonvectorized_string_comparison.plot(logx=True, logy=True, time_unit='s')\n",
    "plt.ylabel(\"Runtime [log10(s)]\")\n",
    "plt.savefig(\"nonvectorized_string_axis1_speed_comparison_loglog.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Groupby Apply aggregation function speed comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "SIZE = 100000000\n",
    "data = pd.DataFrame({\n",
    "    \"groups\": np.random.choice(np.arange(100000), size=SIZE),\n",
    "    \"normal\": np.random.normal(size=SIZE),\n",
    "    \"exponential\": np.random.exponential(size=SIZE),\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0% 0/11 [00:00<?, ?it/s]\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:00,  2.12it/s]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:01<00:00,  1.14it/s]\u001b[A\n",
      "100% 3/3 [00:02<00:00,  1.42it/s]\u001b[A\n",
      "  9% 1/11 [00:02<00:21,  2.14s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.22it/s]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:01<00:00,  1.01it/s]\u001b[A\n",
      "100% 3/3 [00:02<00:00,  1.19it/s]\u001b[A\n",
      " 18% 2/11 [00:04<00:21,  2.41s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.26it/s]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:02<00:01,  1.06s/it]\u001b[A\n",
      "100% 3/3 [00:02<00:00,  1.09it/s]\u001b[A\n",
      " 27% 3/11 [00:07<00:20,  2.59s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.03it/s]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:02<00:01,  1.24s/it]\u001b[A\n",
      "100% 3/3 [00:03<00:00,  1.09s/it]\u001b[A\n",
      " 36% 4/11 [00:10<00:20,  2.88s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:01<00:02,  1.00s/it]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:02<00:01,  1.43s/it]\u001b[A\n",
      "100% 3/3 [00:03<00:00,  1.23s/it]\u001b[A\n",
      " 45% 5/11 [00:14<00:19,  3.19s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.39it/s]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:03<00:01,  1.69s/it]\u001b[A\n",
      "100% 3/3 [00:03<00:00,  1.25s/it]\u001b[A\n",
      " 55% 6/11 [00:18<00:17,  3.40s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:01<00:02,  1.38s/it]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:04<00:02,  2.45s/it]\u001b[A\n",
      "100% 3/3 [00:06<00:00,  2.01s/it]\u001b[A\n",
      " 64% 7/11 [00:24<00:17,  4.27s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:05<00:10,  5.22s/it]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:09<00:04,  4.49s/it]\u001b[A2022-07-24 03:25:03,657\tWARNING services.py:2002 -- WARNING: The object store is using /tmp instead of /dev/shm because /dev/shm has only 67104768 bytes available. This will harm performance! You may be able to free up space by deleting files in /dev/shm. If you are inside a Docker container, you can increase /dev/shm size by passing '--shm-size=10.24gb' to 'docker run' (or add it to the run_options list in a Ray cluster config). Make sure to set this to more than 30% of available RAM.\n",
      "\n",
      "100% 3/3 [00:14<00:00,  4.90s/it]\u001b[A\n",
      " 73% 8/11 [00:39<00:22,  7.56s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:18<00:36, 18.27s/it]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:24<00:11, 11.18s/it]\u001b[A\n",
      "100% 3/3 [00:26<00:00,  7.04s/it]\u001b[A\n",
      " 82% 9/11 [01:05<00:27, 13.52s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:34<01:09, 34.77s/it]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      " 67% 2/3 [00:44<00:19, 19.76s/it]\u001b[A\n",
      "100% 3/3 [00:48<00:00, 12.68s/it]\u001b[A\n",
      " 91% 10/11 [01:53<00:24, 24.25s/it]A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:38<01:16, 38.35s/it]\u001b[A/tmp/ipykernel_31702/2989292544.py:2: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  return x[\"normal\"].mean() / x[\"exponential\"].var()\n",
      "/tmp/ipykernel_31702/2277446876.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:48<00:21, 21.68s/it]\u001b[A\n",
      "100% 3/3 [00:54<00:00, 18.10s/it]\u001b[A\n",
      "100% 11/11 [02:48<00:00, 15.30s/it]\n"
     ]
    }
   ],
   "source": [
    "vectorized_comparison = perfplot.bench(\n",
    "    setup=lambda n: data.iloc[:n],\n",
    "    kernels=[\n",
    "        lambda df: df.groupby(\"groups\").apply(agg_func),\n",
    "        lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(agg_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
    "        lambda df: df.swifter.progress_bar(False).groupby(\"groups\").apply(agg_func),\n",
    "    ],\n",
    "    labels=['Pandas Apply', 'Dask Apply', 'Swifter Apply'],\n",
    "    n_range=[2**k for k in range(0, 22, 2)],\n",
    "    xlabel='n_rows',\n",
    "    equality_check=None\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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+PGceuqp9OnTh6uvvprKSqeOnJaWxi9+8QsGDBjAxIkT2blzZ40058yZU6M18MEHHxz2tXFTEWhL4E8icgfwX+Bg1UlV/bq2CK6r52lghao+7HHpLZxlKv/o/r5ZX6FDzcKNe3jy43VMHdWJ43q3CbU4hhEa3rsVti49oiSSK8oh1kMNHTUITv5jvdLo3r07FRUVbN++nbZt2/LBBx+QlJTE6tWrmTp1KgsWLOCll17ipJNO4re//S0VFRU15uzftm0bp512Gvfcc0/15G+evPnmm0yePJnevXuTlZXFwoULq6ednj9/PsuXL6dLly5MnjyZ119/nbPOOot9+/aRk5PDI488wl133cUf/vAHZsw4tPTKhAkT+OlPf8qOHTto06YNzz77LJdddlk9717jEGhLYBBwJY7ifsjd6lqLbQxwEXC8iCxyt1PcNE4QkdXAJPe42VBSVsHNry6mXctkfnNKv1CLYxiGB2VlZVx55ZUMGjSIs88+m+XLlwMwcuRInn32WaZPn87SpUur3TFlZWVMnDiR+++/36cBgEPTQwOcd955NRaLGTVqFN27dyc2NpapU6dWTwMdExPDueeeCzjTQ3/xxRc10hQRLrroIl544QUKCgqYN28eJ598cuPejAAJtCVwNtBdVUsDTVhVP8VZdMYXjf/tcxPx4PurWLdzHy9cPpoW5gYyopl61th9caABfQLerFu3jtjYWNq2bcudd95JdnY2ixcvprKykqSkJMCZNfTjjz/mnXfeYdq0adx4441cfPHFxMXFMWLECN5//32OO+64w9LevXs3c+bMYenSpYgIFRUViAgPPPAAENg00LWdv/TSS/nxj39MUlISZ599NnFxgarjxiXQlsAyICOIcjQLFmzYzdOfreeC0Z0Z26vumQoNwwguO3bs4Oqrr+a6665DRCgsLKRdu3bExMTwz3/+s3rxl40bN5Kdnc2VV17JFVdcwddfO55sEeGZZ55h5cqV3Hff4cumv/baa1x00UVs3LiRDRs2kJ+fT7du3ar7FObPn8/69euprKzk5Zdfrp4GurKyktdeew1wpoc++uijD0u7ffv2tG/fnnvuuafR1wioD4EagQxgpYi8LyJvVW1BlCvsOFBawU2vLqZDRjK/NjeQYYSMqpXFBgwYwKRJkzjxxBO54447APjpT3/K888/z5AhQ1i5ciWpqamA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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "vectorized_comparison.title = \"GroupBy Apply Aggregation Function Speed Comparison\"\n",
    "vectorized_comparison.xlabel = \"n_rows\"\n",
    "vectorized_comparison.plot(logx=False, logy=False)\n",
    "plt.savefig(\"groupby_apply_agg_func_speed_comparison.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbYAAAEbCAYAAAC2i6FAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABYtklEQVR4nO3dd3gU1frA8e+bQgIJBEgg0qRI7x0bSBUEESkKCCLSREVR78/e0KvXhnptqFxUsBBQVJRmxQgIUkU60kIIvSUkhLTN+f0xE1hCyqbuZvN+nidPdsrOvGdndt49Z87MiDEGpZRSylv4uDsApZRSqjBpYlNKKeVVNLEppZTyKprYlFJKeRVNbEoppbyKJjallFJeRRNbMRCRmSLygrvj8DQiskRE7nB3HEVBRBJEpJ674ygqIhIpIuPcHUdRKO5tZx8fUkQkqrjW6Q4i0lVEYgrw/qUikiQiK3KbN0+JTUSGichqETkrIsfs1/eIiOQ32PwSkdEi4rB3wgQR2SsidxdwmcH2spYUVpyFQUTqiki6iLzv7ljyS0SmiMjnzuOMMTcYY2YVwboyDhQJTn9DC3s9Tuu75CBvjAk2xuwtgnVdKyIrRSRORE6JyB8i0qGw11NQItJQRL4SkRN2rJtE5CER8XV3bLkpqm2Xi1eNMXUyBorih0NW38HClum4fEZENorIjflYziWVAWNMd2CiK+93ObGJyL+At4DXgMuAcHsl1wBlsnlPUe/Eq+ydMBgYDLwqIm0KsLzBQDLQS0QuK5QIC8co4DQwVEQCimIFYvGmGvyrGfuG/TfX3QEVlIhUABYC7wCVgRrAc1j7rMcQkSuA1cABoIUxJgS4BWgPlHdnbDkRET93x+AlVtnH5IrAR8CXIlKpOANw6UAmIiHA88A9xph5xph4Y/nLGDPCGJNszzdTRN4XkcUichboJiJN7F8fsSKyVURuclruRb9K7Gy/wmnYiMj9dm3shIi8lt3B1xjzF7AdaGK/d5GI3JepHJtEZGAORb0D+ADYBIzM9N4oEXlcRLaJyGkR+UREAu1pXUUkRkSesOOMEpER2XyWW0Skv9Owv/2eLBOyXRseBTwFpAL9M02/XkR22r+Kp4nI7xmfqYj4isjr9vL3icgk+zP1s6dHisiLIvIHkAjUE5HGIvKzXRvYKSK3Oq0rVEQW2L/E1orIC5m211sicsCevl5EOtvj+wBPYCXmBBH522n9GbH6iMhTIrJfrNaAT+39DhGpY8d9h4hE2+V5MoftmKXMvwIlU9OIvd3+z95P4kRkbsY2tqcPsH+BnhGRPSLSR0ReBDoD79ple9ee14hIfft1iF2e43b5nsrYjzP2eRGZau9X+0TkhmyK0BDAGBNhjHEYY84ZY34yxmxyWtYfIvKuHf8OEenhFH+IiHwkIodF5KC9/Xydpo8Rke12HD+KSG2nab3s5cXZZcypleY5YKUx5iFjzGE75p3GmNuMMbH28m4S63gQa+8HTTJth4ft7XDWjjlcrKbreBH5RewDpdO+MUFEDtll+z+nZXUUkVX2eg7bn00Zp+lGRO4VkV3Ariy2XV+xvvPx9mfmvOzxIrJbrO/K9yJSPdNyJ4rILnvd74kUvGUrp++JPX2UPe2kiDxtf5Y9XVhuTtujrYj8ZX8GX9nfi1xPrRhj0oGPgbLAFVmsM8vcICITgBHAI/Z3aoFLH06mlef6B/QB0gC/XOabCcRh1eJ8sH6d7cY6qJUBugPxQCN7/khgnNP7RwMrnIYN8BvWr9PLgX8y5s9i3g5ALNDQHr4VWO00vRVwEiiTTey1gXSgKfAvYFOm6VHAFqCWHc8fwAv2tK725/MGEABcB5x1KudMp3kfAeY6LXcAsDmHz7Qz1i/ySli/1Bc4TQsDzgCDAD9gMlbyy/iMJgLbgJr2+3+xP1M/p88/Gmhmvz8E61f2nfZwG+AE0NSef479V87+nA5k2gYjgVD7vf8CjgCB9rQpwOeZynZ++wNjsPaVekAw8A3wmT2tjh33/7C+JK3sz6RJDvvhC7mNt7dbTKZtvAaobm/j7cBEe1pHrH27F9a+XQNonNV+7LTv1rdffwp8h/V9qIO1H4912o9TgfGAL3A3cAiQLOKvgLUPzwJuACplmj4aaz98EPAHhtoxV7anfwt8CAQBVe2y3uW0H+7G+mHoh/VDaqXTfhYPDLGX+6C9nnHZfP5HgDtz2KcbYn0/etnLe8Redxmn7fAnVqtQDeAYsAFrfwwElgLPZto3IuxytQCOAz3t6e2AK+0y1bG36QOZttPP9vYum8W2Owx0tl9XAtrar7tjfTfaYn3n3wGWZVruQqxay+V2TH1c3V/JYp9y4XvSFEgArsU63k7F2rcyPospZPoO5rY97L/9WMcWf6xjTUrmeLM6hnPhmBSPdWzpiv19s5eVU2645DPJ6rif7T6W2wxOB6wjmcatxEok54AuTsF8mumgfATwcRoXAUzJauNlDtreOfo4Dd8D/JrpSxxrfyDG3rnEnh6I1XzXwB6eCkzLoYxPARvt1zUAB9Am00FvotNwX2CP0wEyDQhymv4l8HTmjYR10IwHKtjD84BHcohrBjDffn0V1o5a1R4ehVXtz5hXsJJNRrJYin3gsod7cmlie95p+lBgeab1fwg8i3XQTc3Y8expL+S0k9mff6vsvlRcnNh+xWoRyJjWyF5fxgHJADWdpq8BhuVwoEiy941Y4ERWXxayTmwjnYZfBT5w+hzezGZ958uRad+tb39uKdg/DuxpdwGRTvvxbqdp5ez3XpbNuprY5YjB2ue+B8KdlnVRUrQ/p9uxkkQy9sHbnjYc+M1+vQQ72drDPli1+NpY+9mfmfazmMxldpqeSjYHcXv608CXmdZ1EOjqtB1GOE3/Gnjfafg+LnwnMvaNxpm220fZrPsB4NtM26l7VtvOfh1tb68Kmeb5CKu5O2M42C53HadlXJvpePBYDvurq4ktp+/JM0BEpn0phdwTW7bbA+hiv3bep1Zkjtdp2mguHJdPYP1AyVh/Vy4kttxywyWfidPyc01srp5TOQmEiVMbtDHmamNMRXua83IOOL2uDhwwVpU0w36sxOEq5+Xtt5eZ4U9jTEVjTHms837NgP/Y8SUBc4GRdrPPcOCzHNYzCvjCfu9B4HespklXYzltjDmbw3TsZR/Cqu0NFpGKWL+8v8gqIBEpi3VuIiOuVVhftNvsWao7x2SsLe/c6+ii6ZleZzWuNtDJbhqIFZFYrCaBy4AqWF+ebJcnVjPedru5KhbrV1pYVmXLQnWszyzDfnt94U7jjji9TsQ6mGRnqr1vVDTGuBpDTuuoBezJw3IyhGH9Os1cNufvwPl1GmMS7ZdZls0Ys90YM9oYUxNojvW5/ddploP2fuC8rupY29YfOOy0bT/EqrlhT3/LadoprARWg6z3s6z2pQwngWo5TL9oW9vHhwNc/JkcdXp9LovhzJ9Plt9NsTqxLBSRIyJyBuv4kHl/yKksg7F+xO4Xq5n/qmzKkIBV7iy3K7nvr67K6XuSeTsl2jHlaZmZtkd1Lt2ncvq84MJxOcwYc6Ux5pds1lnQ3JAtVxPbKqxfewNcmNf5AzgE1JKLz4tdjvULAKzqbzmnaVl12KiV6b2HslypMUexftk5n4OahXVg7gEk2onhEiJyNdAAeNz+AhwBOgG3ycUnlHOKpZKIBLkSqx3XSKyktcpOpFkZiNX8NM0prhpcSLiHsZoZM8ohzsOZp2eKP0PmHfZ3p4RQ0VgdL+7GakpJy255Yp1PewSrCbiS/aMnjgvnYpzXk5VDWAfXDJfb6zua9ez54sr+lp0DZHGewJZT2U5g/aLOXLbstrnLjDE7sH7ZNncaXSPTuZyM/fAA1nc4zGnbVjDGNLPnO4BVu3fe9mWNMSux9iPnbS1kvS9l+AUrIWTnom3ttLyCfCbZfTffB3ZgtdxUwGr6ynyuK9vtZ4xZa4wZgPUDYD5WzQsuLUMQVjN8gbdrLnL6nmQ+HpS1Y8rTMjNtj8Ncuk/ltO1dlVtuyO14kSOXEpuxTvg+h3WAHSIi5e2TmK2x2rWzsxrrl8ojYnWS6IqVeObY0zcCg0SknH2ydmwWy3hYRCqJSC2s9tose7eJSChWItjqFPcqrPNmr5Nzbe0OrHb2pkBr+6851vkc5xP594pITRGpDDyZRSzPiUgZ+yB/I/BVNuubj9U2Pxnr/EtOcX2Mdd4gI65rgFYi0gJYBLQQkZvtBHwvFx+svwQmi0gNu3b4aA7rAuucQEMRud3eXv4i0kFEmhhjHFjt+VPs7dUYq5aboTzWF+w44Cciz2Al5QxHgTqSfc/LCOBBsS5tCMb6ZT3XGJOWS8x5sRHoKyKVxer1+kAe3vsRcKeI9LD3/Rr2ZwBW2bK87sn+3L4EXrS/N7WBh4A8d7sWq2PPv0Skpj1cC6sl4k+n2aoC99vb7haspsvFxurE8RPwuohUsMtwhYhcZ7/vA6wfds3sZYfY7wdrP2smIoPs/ex+cv5R8CxwtVidvS6zl1dfRD6398MvgX72Z+mPdT42Gev0Rn49be+XzbDOEWd8N8tjnYdOsLeXy5cE2d/lESISYoxJtZeTUcOIwNofWovVU/k/WOf0owpQhsz8RCTQ6c+fnL8n84D+InK1WB1kpnBpEvfJtMwAct4eq7BOy0wSET8RGYB1vrmgcssN2X6nXOFy925jzKtYX8hH7JUexWrKeJRsdkhjTIod7A1Yv1ynAaPsX5oAb2K1AR/FqsVk1ST3HbAe66C0COsAk+Eqsa9TwjopfByr/d3Zp1iJIcsDiVi93m4F3jHGHHH624eVDJ2bI2djHRz2YjVLOfcMOoJ1TumQXY6JTuW8iDHmHFbtsi5WssgqrhpYNc3/ZoprPfADcIcx5gRWre9VrCaHpsA6LnT//p8d7ybgL2AxVvJxZBNXPHA9MMwuxxHgFayT4wCTsJoXj9ifTYTTun604/oHq0khiYubLDKS/EkR2ZDF6j+2l7kM2Ge/P/O2LKjPgL+xzuH8RDY/krJijFmDdcB8E6sm+jsXfuW+BQwRqzfh21m8/T6s2uJerPMTs7HKm1fxWC0Jq8XqdfwnVoemfznNsxqr9eEE8CIwxBiT0Rw1CutE/TasfXUedpOhMeZbrG09R6wmuy3YP+qc9rOXsfazBljN6VkyxuzBOh9cB9gqInFY+/s6IN4YsxOrxeIdO87+QH/7eJFfv2N1RvgVqxn6J3v8/2E13cdjfR/yetnH7UCU/ZlMxGoBwm5ee9ou12Gs2vywAsSflfexml0z/j4hh++JMWar/XqOHVMCVscb58tBhmda5p6ctoe9TQZhVTpi7fkWUsBLTFzIDR8BTcVqGp+f1+VndLTwSCJisJoQdhdgGaOACcaYawsYSxTWydxL2ovtXxuf2+c9XF3eM1g9OEfmOrPry/TBOsc2whjzWxbTb8DqDFH7kjfnb32vYHVyyHwuUrmBiIzG2kcLtK+XJCJSB+sA71/ItftiIyL/w0o4R40x2TV352e5wVjJqIH9Q72wlrsa6zjySWEt08X1/ozVw3WNMaZHTvN60wW5lxCRclg9Kae7OxZndlPmWAohLhHpLSIV7SaFjPMHf9rTyop1HY6fXQN8FqvLd37X1VhEWoqlo12GfC9PKQXGmPH2uewCJzUR6W83yQZh9QTfjNVCUZBlXicil9nHkTuAllitM8XKGNPLGFM+t6QGXpzYRKQ3VtPkUaymH48gIuOxmuiWGGOWFcIir8JqFs1oQrjZbuoEK8k9h9Xs9BdWc+0zBVhXeaym07NYTTqvYzUVK6U8wwCs0wiHsJqMh5mCN8s1wmrCj8Vq9h5in7P1WB7dFKmUUkrlldfW2JRSSpVOmtiUUkp5Fa+8m3VYWJipU6dOvt579uxZgoJyujSv5PCWsnhLOcB7yuIt5QDvKUthlGP9+vUnjDFVCikkt/GqxCbWXfP7169fn3Xr1uVrGZGRkXTt2rVQ43IXbymLt5QDvKcs3lIO8J6yFEY5RGR/7nN5Pq9qijTGLDDGTAgJCXF3KEoppdzEqxKbUkoppYlNKaWUV/Hac2yZpaamEhMTQ1JSUo7LCAkJYfv27UUUYfEqCWUJDAykZs2a+Pv7uzsUpZSX8KrEZoxZACxo3779+MzTYmJiKF++PHXq1EFyeEJ7fHw85cuXL8owi42nl8UYw8mTJ4mJiaFu3bruDkcp5SVKTVNkUlISoaGhOSY1VbxEhNDQ0Fxr0UoplRelJrEBmtQ8kG4TpfLPGENiShpH4pI4mJDO+v2nSErN8qlUpYpXNUXmdI7NE/j6+tKiRQvS0tJo0qQJs2bNoly5crm/MQdTpkwhODiY//u//ytwfP/973957LHHOHr0KAW5ZKJr165MnTqV9u3bFzgmpbxZSlo68UmpnElKIz4plfikNM6cs/87jT9zzml6pv+OdKf7/a5YxW//15W6YSX/gvOC8KrEltM5Nk9QtmxZNm7cCMCIESP44IMPeOihh9wblJOIiAg6dOjAN998w5133unucJQqcdLTDav3neKfo/EXJawzmRJWvD0+KTU912UGB/hRIdCP8oH+lA/0I7xCIPWr+lHBHi4f6E+Fsn4c2LuLK9u2pGr5gFyX6e28KrGVJJ07d2bTpk0sWLCAF154gZSUFEJDQ/niiy8IDw9nypQpREdHs3fvXqKjo3nggQe4//77AXjxxReZNWsWVatWpVatWrRr1w6A//3vf0yfPp2UlBTq16/PtGnTKF++PF999RXPPfccvr6+hISEsGzZpU/L2bNnDwkJCUybNo0XX3zxfGKbOXMm3377LXFxcRw8eJCRI0fy7LPPEhUVRZ8+fWjXrh0bNmygWbNmfPrppxfVQD/++GM2bdrEf//73/Pxbdu2jTfffLOIP12litex+CTmrY9h7toD7D+ZeH58gJ/P+cRTPtCfCoF+1KhY1k5IF5JThbL+5xOX87jgAD98fVxrro88t4+ujaoWVRFLlFKZ2J5bsJVth85kOc3hcODr65vnZTatXoFn+zdzad60tDSWLFlCnz59uPbaa/nzzz8REWbMmMGrr77K66+/DsCOHTv47bffiI+Pp1GjRtx9991s2rSJOXPmsHHjRtLS0mjbtu35xDZo0CDGj7cqq0899RSffvopDz/8MM8//zw//vgjNWrUIDY2NsuY5syZw7Bhw+jcuTM7d+7k6NGjhIeHA7BmzRq2bNlCuXLl6NChA/369SMsLIydO3fy0Ucfcc011zBmzBimTZt2UZPorbfeyosvvshrr72Gv78/n3zyCR9++GGeP1ulPJEj3bB813HmrDnAL9uPkpZu6FS3Mg/2bMg19cOoUNaPAL+8H0tUwZXKxOYu586do3Xr1oBVYxs7diw7d+5k6NChHD58mJSUlIu6vffr14+AgAACAgKoWrUqR48eZfny5QwcOPB8zeimm246P/+WLVt46qmniI2NJSEhge7duwNwzTXXMHr0aG699VYGDRqUZWwRERF8++23+Pj4MHjwYL766ismTZoEQK9evQgNDQWs5LlixQpuvvlmatWqxTXXXAPAyJEjefvtty9KbMHBwXTv3p2FCxfSpEkTUlNTadGiRSF9mkq5x+G4c3y5NoYv1x3gYOw5QoPKMObaugztUIsrqgS7OzyFlyU2VzuP5FSzKsprv5zPsWW47777eOihh7jpppuIjIxkypQp56cFBFxoK/f19SUtLS3H5Y8ePZr58+fTqlUrZs6cyc8//wzABx98wOrVq1m0aBHt2rVj/fr15xMVwObNm9m1axe9evUCOJ9gMxJb5p6LGcPZjXc2btw4/vOf/9C4cWM9b6dKrDRHOr/tPM6cNdH8tvMY6QY6Nwjjib5N6NU0nDJ+paqDucfzqq1REm+CHBcXR40aNQCYNWtWrvN36dKF+fPnc+7cOeLj41mwYMH5afHx8VSrVo3U1FS++OKL8+P37NlDp06deP7556lSpQoHDhy4aJkRERFMmTKFqKgooqKiOHToEIcOHWL/futG3z///DOnTp3i3LlzzJ8//3wtLTo6mlWrVgEwe/Zsrr322kvi7dSpEwcOHGD27NkMHz48j5+OUu514FQiU3/cyTWvLGX8p+vYfDCOu7tewbKHu/HZ2E70a1lNk5oH8qoaW0k0ZcoUbrnlFipVqkT37t3Zt29fjvO3bduWoUOH0qpVK6pWrUqHDh3OT/v3v/9Np06dqFKlCp06deLUqVMAPPzww+zatQtjDD169KBVq1YXLXPOnDksXrz4onEDBw5kzpw5hIeH07FjRwYPHkxMTAwjR46kffv2REVF0ahRI9577z3GjBlD06ZNufvuu7OM+dZbb2Xjxo1UqlQpPx+RUsUqJS2dX7YfJWJNNCt2n0CAro2q8u8BtejeuCp+vprIPJ0mtmKUkJBwybgBAwYwYMCAS8Y7N0mCdf4sw5NPPsmTTz55yXvuvvvui5JLfHw8AN98802Oce3du/eScW+88QZg9YqsWbMm8+fPv2QePz8/Pv/880vGR0ZGXjS8YsUKHnzwwRxjUMrd9h5PYO7aA8xbH8PJsylUDwnkgR4NuaV9TapXLOvu8FQeaGJTRSY2NpaOHTvSqlUrevTo4e5wlLpEUqqDVYfSeP/DVazedwpfH6Fnk6oM63g5XRpUcbmrvfIsmthUjkaPHs3o0aMvGV+nTp2LapFZqVixIv/8808RRaZU/v1zNJ6INdF8+9dBYhNTubyyLw/3bsQt7WpStUKgu8NTBaSJTSlVKpxLcbBw0yEi1kSzIToWf1+hd7PLaBpwmokDu+KjtTOvoYlNKeXVthyMY87aaL776xDxyWnUqxLEk32bMKhtDUKDA4iMjNSk5mW8KrF5+k2QlVLFI82Rzrz1McxeE82mmDgC/Hzo16IawzpeToc6lfSpEl7OqxKbp98EWSlV9I7FJ3Hf7L9Yve8UjS8rz5T+TRnYpiYh5fQp7aWFXpBRjHx9fWndujXNmjWjVatWvP7666Sn535376wEB7t265758+cjIuzYsSNf68kwevRo5s2bV6BlKFXU1uw7Rb+3V/B3TCyv39KKJZM7M/qauprUShlNbMUo45ZaW7du5eeff2bJkiU899xzRbrOiIgIrr32WiIiIop0PUq5kzGG6cv2MPx/fxIc4Mf8e69hcLua2uRYSmlic5OqVasyffp03n33XYwxREVF0blzZ9q2bUvbtm1ZuXIlAIcPH6ZLly60bt2a5s2bs3z58ouWc+LECa666ioWLVp0yToSEhJYsWIFH330EXPmzDk/PjIyki5dutCvXz8aNWrExIkTz9ccg4ODefDBB2nWrBk9evTg+PHjFy1z6dKl3HzzzeeHf/75ZwYOHFhYH4tSeXYmKZWJn6/nP4t30KtJON9PuobGl1Vwd1jKjbzqHJvLljwGRzZnOamsIw188/GxXNYCbng5T2+pV68eDoeDY8eOUbVqVX7++WcCAwPZtWsXw4cPZ926dcyePZvevXvz5JNP4nA4SEy88Kyno0ePctNNN/HCCy+cv4Gxs0WLFtGnTx8aNmxIaGgo69evP/+ImzVr1rBt2zZq165Nnz59+OabbxgyZAhnz56lffv2vPnmmzz//PM899xzvPvuu+eX2a1bN+655x6OHz9OlSpV+OSTTxgzZkzePy+lCsG2Q2e454v1HDh9jqf6NWHstXW1lqa0xuYpUlNTGT9+PC1atOCWW25h27ZtAHTo0IFPPvmEKVOmsHnz5vNPHkhNTaVHjx68+uqrWSY1gHnz5jFs2DAAhg0bdlFzZMeOHalXrx6+vr4MHz6cFStWAODj48PQoUMB61E0GeMziAi33347n3/+ObGxsaxatYobbrihcD8MpVzw1boDDJz2B4kpDuZMuJJxnetpUlNAaa2x5VCzOleEj63JbO/evfj6+lK1alWee+45wsPD+fvvv0lPTycw0Lr7QZcuXVi2bBmLFi1i9OjRPPTQQ4waNQo/Pz/atWvHjz/+yHXXXXfJsk+dOsWyZcvYvn07IoLD4UBEeO211wDXHjmT3fg777yT/v37ExgYyC233IKfX+ncjZR7JKU6mPL9VuasPcBV9UJ5e3gbqpQPyP2NqtTQGpubHD9+nIkTJzJp0iREhLi4OKpVq4aPjw+fffYZDocDgP379xMeHs748eMZN24cGzZsAKyE8/HHH7Njxw5eeeWVS5afUVvbv38/UVFRHDhwgLp1654/R7dmzRr27dtHeno6c+fOPf/ImfT09PO9H7N7FE316tWpXr06L7zwgj5jTRWr6JOJDH5/JXPWHuCerlfw2diOmtTUJTw+sYlIPRH5SERKfF/zjCdoN2vWjJ49e3L99dfz7LPPAnDPPfcwa9YsWrVqxY4dOwgKCgKsjh6tWrWiTZs2zJ07l8mTJ59fnq+vLxERESxdupRp06ZdtK6IiAhuvPHGi8YNHjz4fHNkhw4dmDRpEk2aNKFu3brnO4AEBQWxZs0amjdvztKlS3nmmWeyLMuIESOoVasWTZo0KZwPR6lc/Lr9KDe+s5wDpxKZMao9j/RprI+QUVlySxuSiHwM3AgcM8Y0dxrfB3gL8AVmGGNeNsbsBcZ6Q2LLqIVlpUGDBmzatOn8cEYt7I477uCOO+64ZP6MR+AEBATw448/XjL9t99+O//Ymgz3338/YCXLChUqsHDhwixjyXhkjbOZM2deNLxixQrGj9fr4FXRS3Ok88bP/zAtcg/Nqlfg/RHtuDy0nLvDUh7MXT93ZgJ9nEeIiC/wHnAD0BQYLiJNiz80lZt27dqxadMmRo4c6e5QlJc7Hp/M7R+tYVrkHoZ3rMXXd1+tSS0rjjT8UhMgLgYcqe6Oxu3cUmMzxiwTkTqZRncEdts1NERkDjAA2FbM4Xm9rl270rVr1yynZfUw1MzWr19fyBEpdam1UaeYNHsDsYmpvDakJbe0r+XukApHejqkJkJKAqSctf4nZ7yOt/+ftcclZDOf0/jkBHAkcy3AH8B9GyD0CjcX0r08qTtbDeCA03AM0ElEQoEXgTYi8rgx5qWs3iwiE4AJAOHh4Zc8xTkkJOSSprmsOBwOl+YrCUpKWZKSki7ZXs4SEhJynF6SeEtZirIcxhh+2p/G3J0pVCkrPNkxgCoJe4iM3FMk6yussvilJhASt52QuK0EJh3D15GEr+Oc/T/j9Tl8HckIxqVlpos/Dt9AHL5lSfMre/61w7cCjoBwHOUyhsuS6BB8y1XkxIbtpPkfyH3hXsyTEluWjDEngYkuzDcdmA7Qvn17k7lGsn37dpe68ccXY3f/olZSyhIYGEibNm2ynR4ZGZltDbOk8ZayFFU54pNSeWTeJpbsOML1TcOZemsrKgQW7X0e812Wsydh/x+wfyXsXwFHtgAGfMtAxcshIBgCQqFMkP0XbP0FBF88XCbIHpdp2D8IH78y+ACufALesm8VBk9KbAcB57aGmvY4l+lja5QquXYcOcPdn28g+lQiT/RtzHhPu+A6/qiVwKLsZHZ8uzXeLxBqdoCuj0Hta6Bme/Av695YSzlPSmxrgQYiUhcroQ0DbsvLAvSxNUqVTN9siOGJbzdTPtCf2eM60aleqLtDsjpiRP1hJbP9K+Hkbmt8mWCo1QlaDIE610L1tuBXxr2xqou4q7t/BNAVCBORGOBZY8xHIjIJ+BGru//HxpiteVyuR9fYXnzxRWbPno2vry8+Pj58+OGHdOrUKdf3PfPMM3Tp0oWePXuyfPlyJk6ciL+/P++//z6nT5+mb9++BY5t/vz5DBw4kO3bt9O4ceN8L2f06NHceOONDBkypMAxKe+XlOrg+YXbmL06mk51K/PObW2oWj6w+AMxBk7vsxJYRjKLjbamBYRA7aug7R1Wjaxaq/zdT1YVG3f1ihyezfjFwOICLNdja2yrVq1i4cKFbNiwgYCAAE6cOEFKSopL733++efPv/7iiy94/PHHGTlyJDNnzmTdunV5SmxpaWlZ3gLL+fE2Rf0oHaUADpxK5J4vNrD5YBwTr7uC/7u+YfFdcG0MnNgF+1fQZNu3sP5uiD9kTStbGWpfDVfeYyWy8Gbg41s8calC4VWX7YtIfxGZHhcX5+5QLnH48GHCwsIICLBu/xMWFkb16tVZu3YtgwYNAuC7776jbNmypKSkkJSURL169YALD/mcMWMGX375JU8//TTDhw/nmWeeYe7cubRu3Zq5c+dy9uxZxowZQ8eOHWnTps35R9nMnDmTm266ie7du9OjR49LYtPH26ji9tuOY9z4zgqiTp5l+u3teOyGIr6LSHo6HN0Kq6fDl3fA1IbwXgdY+CCVTm+CyztB36lwz5/w8B4Y9gVceTdUa6lJrQTyqvq0qzW2V9a8wo5TWT9R2uFw4Oub9x25ceXGPNrx0WynX3/99Tz//PM0bNiQnj17MnToUK677jratGnDxo0bAVi+fDnNmzdn7dq1pKWlXdJMOW7cOFasWHG+qS+jxpbxWJknnniC7t278/HHHxMbG0v79u3p378/ABs2bGDTpk1Urlz5kti+++47fbyNKhaOdMN/f/mHd5bupkm1Cnwwsi21Q4MKf0Xp6XBkk9VrMeoPiF4J505b0yrUhCu6WbWy2teycvMBunbrVvgxKLfxqsTmyYKDg1m/fj3Lly/nt99+Y+jQobz88suMHj2aK664gu3bt7NmzRoeeughli1bhsPhoHPnznlax08//cT333/P1KlTAUhOTiY62jpP0KtXryyTGljNkBn3oMx4vE1GYst4vA1w/vE2Q4YMueTxNhm1zgzOj7e58847WbVqFZ9++mmeyqO8y8mEZCbP2ciK3Se4tX1Nnh/QnED/QqwNxR2Evb/BnqWw5zc4d8oaX6kONOoHda6xklnF2uDc21JiCi8GNzHGcCL1BD9E/UDPy3vi51O6D+1eVXpXO4/kVLMqymu/fH19z9/1o0WLFsyaNYvRo0fTpUsXlixZgr+/Pz179mT06NE4HI7zj5hxlTGGr7/+mkaNGgEXyrJ69erzN1XO7NSpUyxdupTNmzfr421UkVm//zT3frGB04kpvDq4Jbd2KIS7iKSctTp77Flq/R23W2GCw6Fhb6jXzeq1GFKj4OvyIMYYjiYeZcuJLWw9uZWtJ7ay9eRWzqScgUPwzU3f0KBSA3eH6VZedaTx5M4jO3fuxMfHhwYNrB1u48aN1K5dG4DOnTszatQoRo0aRZUqVTh58iRHjx6lefPmOS2S8uXLX3Rnkd69e/POO+/wzjvvICL8/fffWT52xtm8efO4/fbb+fDDD8+Pu+666y55vE3t2rWZO3cuEyZMAC483mbYsGEuPd7ml19+ceFTUt5m64mtzF6/ibm/V6B6xXJ8c8/VNKsekr+FZTQvZiSyA6vBkWJdR1b7amgzEq7oDlWbXlwjK+GOJx63EphTEjuVZNVG/cSPBpUa0Kt2L/xP+jPo6kHUCanj3oA9gFclNk+WkJDAfffdR2xsLH5+ftSvX5/p06cD0KlTJ44ePUqXLl0AaNmyJUeOHMn14tRu3brx8ssv07p1ax5//HGefvppHnjgAVq2bEl6ejq1atXihx9+yHEZERERPProxTXYjMfbDB069PzjbXbv3k23bt0uebzNCy+8QNWqVZk7d26Wyx8xYgTHjx/Xx9uUMsYYPt8WwWvrXsXgoEqjK3ilx7N5T2pnDlnNinuWWs2MiSet8eHNodNdViK7/CqvuSD6dNLpixLY1pNbOZZ4DAAf8aFeSD261OxCs9BmNAttRsPKDQnwtTqkRUZG0iRUv2cAYoxr9ywrSdq3b2/WrVt30bjt27e7dHAtKbehckVByxIZGcnUqVOzfLxNcHCwSzdMnjRpEm3atGHs2LHZzpPbtvGmWwV5S1lyKkeyI5knlj3HT9ELSEtoRPfLu7Pt3FecOHeC/vX6M7ntZMKDwrNecEpipuZF++4eQVWtDh9XdId6XaH8ZcVSlqJ0JuUM205uu5DETmzl0FnrkgNBqBNS53wCaxbWjEaVGlHOP/snGxRGOURkvTGmfYEW4gG8qsbm6Rdolzbt2rUjKCiI119/3d2hqGJy5OwRJvx4H/vid8DpnrzT+xF6NqnG2dQ7mLF5Bp9u/ZRfon/hzuZ3MrrZaMr6BMDRLRcSWfQqq3nRN8BqXmx9m5XQqjYDn5J7ddLZ1LNsP7n9otpYdHz0+em1yteiZZWWDG88nGZhzWhSuQnBZYLdGHHJ5lWJzZPPsZVE+ngblRdrj6xl0i8PcjYliQoJ4/j0trHUr2odnIP8g5jcdjKDGwzmjT//w7SN0/jm7xk8GJvADaeOIGAlr44TrFpZ7atLbPNisiP5kiS2L24fxr6jf7WgajQLbcbABgNpFtqMpqFNCQnI53lHlSWvSmxKqeJnjOGzbZ8zdd1U0pJDae73f/xvXD9Cytn3pE9JtK4j2/MbNfcs5Y1j21gXGMCrYVV4NKQMs6tdxSMdHqFlne7uLUgBxcTHMHfnXL7e9TXxKVanrrCyYTQPbU6fun1oHtqcpqFNCS3rAffB9HKlKrEZYzzrbuEKbzzHW5okpSXx5PIp/BS9CL/4K3ggtD+jG8bhs/I/cDrKuv/i0W3gSLYe53L5VdDzOdpf0Z05VZvy3d4FvP3X24z4fTI3HriRyW0nc1lQ4Z0/K2rGGFYfWc3s7bOJPBCJj/jQ4/Ie9K3XlxZhLaharqq7QyyVvCqx5XSOLTAwkJMnTxIaGqrJzUMYYzh58iSBgW646a3Ku5SzdrKKouaBXzj0/Vfcd+pP/pEU7jp1hnvifsPnxG+wE/Dxg5Ba1sXRHcZdaF4sc6Hzgw8wsMFArq9zPR9t/ohZW2fxa/SvF86/+XluU2RiaiIL9y4kYkcEu2N3UymgEuNajOPWRreWqMTsrbwqseV0jq1mzZrExMRcck/DzJKSkrzmQFsSyhIYGEjNmjXdHYYC68bACUfh1L4Lta3TUReGzx47P+vJwADuTK1Csvgw/lhlbqnfD5/LG0HlulYyq1DT5TvgB/kHcX/b+xnccDBvrn+TaRun8fU/X/NguwfpW7evR/0QPRB/gDk75vDt7m+JT4mnSeUm/Puaf3ND3RvOd7tX7udViS0n/v7+1K1bN9f5IiMjc3yac0niTWVRhSQ1yXocS1aJ63QUpJ1zmlkgpKaVqBr2hkp1MJXqMOvMTl7fNRdHShXqpN3LsIl9qVqh4D+gagTXYOp1UxneeDivrHmFx5Y/xuwds3m0w6O0rNKywMvPL2MMqw6vImJ7BL/H/I6v+NKzdk9GNBlBqyqtPCrxKkupSWxKlSqpSdYtpo5ugSObrTvbn9prXfCM03lN/3JW4qpcz2ouzKhxVaoLFWuB34VayLm0czy1/Bl+iv6B1Phm9K76AK8M6lC493sE2oW3Y86Nc/h+z/e8teEtRiwewY31iv/8W2JqIt/v+Z6IHRHsjdtL5cDKjG85nlsb3pr9dXjKI2hiU6qkSzgORzfDkYwktgWO7wTjsKb7l7NuM1Wn88WJq1IdCK7q0u2nYuJjuPeX+9kbt5uU470ZWOV6Xrq1U5HVVnzEh5vr38z1ta9nxuYZzNo6i1/2/8KY5mMY3bxoz79Fn4kmYkcE3+3+jvjUeJqFNuM/1/6H3nV6U8ZXn5RdEnhVYtMLtJVXS3fAyT3W/RIzamJHtkDCkQvzlK8OlzWHRjdYt526rKWVzArwTLGVB1fyUOTDnE1ORU6MY8bA4TgObi2WJrhy/uUuPv/29zS+3vU1D7R7gL51++IjhXPRdrpJ589Df/LFji9YHrMcX/GlV51ejGgygpZhLbW5sYTxqsSmF2grr5EcbzUfHtl84e/Y9gvnwHz8oEpj6/ZSl7Wwkll4CwgqvGukjDF8vOVj3trwNo7kqlRJvIuZY26gTlgQkQcLbTUuyTj/dlvj23hl7Ss8vvxxIrZH8EjHR2hVpVW+l3s29SzL4pfx+vzXiToTRWhgKHe1uotbGt6iXfVLMK9KbEqVOMZA3AGnZkQ7iZ2OujBP2UpW7av9nVYSC28OVRpddP6rsCWmJvLkiqf5JfonUs+05KoKE3l71JWUD/QvsnW6om14WyL6RbBgzwLe2vAWIxePpF+9fjzQ9oE8nX/bf2Y/c3bMYf7u+SSkJtAirIU2N3oRTWxKFZe0ZILj98BfMReaEY9uhqS4C/NUrgfVWkHrkRdqYhVqFOtjWKLPRHPvr/cRFbePpGM3ML7lnfzf9Y3x8fGM5jgf8WFA/QH0qt3r/Pm3X/dfuP4tuxsFp5t0Vh5ayRfbv2DFwRX4+fjRu05vGic2ZnTv0cVbCFWkNLEpVRSSE6zzYIf/hsObrP/Ht9M+PQ3Wc6FDR7NBVvK6rKU1HODeG98uj1nOw78/wtmUdNIOj+WNfrfQv1V1t8aUnYzzb0MaDuHN9W/y/t/v8/WuC9e/ZZx/S0hJ4Ls93xGxI4L9Z/YTVjaMe1rdwy2NbiGsbBiRkZHuLYgqdJrYlCqoxFNWhw7nJHZyN+e71ZcLg2otoUFPtp7ypVn3YVbNrAAdOgpbuklnxuYZvPvXu6QnX0Zw7Dhm3NGb5jU8/+a81YOr89p1r3Fbk9t4Zc2F829jW4xl9eHVzN89n8S0RFpWacnLnV/m+trX4+/r3iZVVbQ0sSnlKmMg/ohTErMTWdyFx49QoabVlNhiiPX/spZQofr5psTjkZEQ1sA98WfjbOpZnlj+JEsP/EpqXGualRnLh/dcRVhwybqTRpuqbZjdb/b582+Tf5uMv48/fer04bYmt9E8LOcn0ivvkW1iE5HvXXj/KWPM6MILRykPYYzVgePw3xfXxpxuK0VofajZHjqMtWpkl7Uq1F6JxWFf3D7uXzqZqLj9JB3rx+ArbuP5Ac0p41cyn33mfP5t5aGVtK7amrCyYe4OSxWznGpsTYBxOUwX4L3CDadg9Do2lS+ONDi560Iz4pFN1utku1OH+ELVJlC/p1ULq9bKOi8WULKftP5b9G88tvxxzqUIyTHjeKZnf0ZeWdsrrtkq51+OnrV7ujsM5SY5JbYnjTG/5/RmEXmukOMpEL2OTeXIGDh73LpX4tGtF5LYkS0Xrg/zC4TwZtBisNWMWK2V1anD37NvJp0X6SadD//+kGl/T4PkGvgev5NZt/XkqitKVm1Tqexkm9iMMV/m9mZX5lGq2KQlQ1yM/Xfgwv/YAxfGO5IvzB9QwepS3/7OC+fDwhq6fFf6kig+JZ7Hlz/O7zG/kxrXltrptzPj7qupVTnrLvJKlUQ5foNFpCYwHLgWqA6cA7YAi4Alxpj0Io9QKbBqW0mxTknqQKakdcB65EpmwZdZd6iv1hIa94WQy63hKo2s+yX6lMxzSfmxJ3YP9y+dzIH4GJKO3ET3agN5Y2hrggK8N5Gr0imnziOfADWAhcArwDEgEGgI9AGeFJHHjDHLiiNQ5eUcaRB/OMuk1eHQTlh5ClISLn6Pb4CVpEJqQoNe1oMtQ2pZwxVrWRc2F+HdOUqSX/f/yuMrniAlxZez0WO5/5o+3Ne9vsdcdK1UYcrpp9rrxpgtWYzfAnwjImWAy4smLOUV0h1w7jQknszi7xQkHLuQyM4cunA3+gxlK0NITRLLVSPoir4XJ62QWhBUpVjvyFESGWOYuXUmb6x/A0m5nLRDt/Pe4K70aa5PeVbeK6dzbJckNRGpBNQyxmwyxqQAu4syOOVBjLFu/ZSRlLJLVs7D505z0bO/nPmXsy5cDqkJta+2a152wsqobdl34dgaGUnXrl2LrajewpHu4NW1rzJ7x2wc8S2pnDiKGXddRePLKrg7NKWKVK6N6yISCdxkz7seOCYiK40xDxZxbKqoGAOpiTknpazGpadlvTwffygXav9VtrrCnx92Gp/xumxlKKOdFYpSUloSjy1/jF+jfyXl5LW0DBrJh/d2oHKQ3uBXeT9XzhqHGGPOiMg44FNjzLMisqmoA1N5kJacZVKqHbUeFi/KOlmlJWW9LPGx7iZfLsxKQpXrQc0OWSQqp2QVUF6bBD1IbFIsk5bex9/H/ybpaD8G1hvOCze3KLEXXSuVV64kNj8RqQbcCjxZxPFcQkSCgGlAChBpjPmiuGMoVo40OOdiU1/GuMydKmx1AY6EXEhEFWpYXdoz156Cwi4MB4Z41D0MVd7ExMcw4aeJxMQf5Nyh4Tx8za1M6FLPKy66VspVriS254EfgRXGmLUiUg/YVZCVisjHwI3AMWNMc6fxfYC3AF9ghjHmZWAQMM8Ys0BE5gJFl9iWv07Trb/CsY/BpFtNdsZYrzFO49KzGJd5vvRsxpH1fOmp1jkp50eYZFYm+OKkFNbw0mY+p7/f12ziuu5694XSYtvJbUz46W7iks6Rdmg8024exPXNtJOIKn1yTWzGmK+Ar5yG9wKDC7jemcC7wKcZI0TEF+sWXb2AGGCtfb/KmsBme7ZM3eYK2ekogs7uB04CYjXLiY918zDxyTROLh3n42s3yeUyn8il8/n42k2AWZyTyqhZ5fHuF8ZHr08qLf44+AeTlz5IUnIAQacn89HoG0vEnfmVKgo5Xcf2FDDNGHMqm+ndgXLGmIV5XakxZpmI1Mk0uiOw206ciMgcYABWkqsJbASK9iTBTe+wtoL2wFMly/xd83lm5bOkJYVTN+1+PrmrJ1UreM8twJTKKzEm6+7YIjIAeARIAjYAx7Eu0G4AtAZ+Af5jjDmerxVbiW1hRlOkiAwB+hhjxtnDtwOdgEexandJWM2hWTZFisgEYAJAeHh4uzlz5uQnLBISEggOdu/DHguLt5TFW8oBhVsWYwxLYn9gyZnFpCXUp0nqHdzVIoQA36I/n6bbxPMURjm6deu23hjTvpBCcpucrmP7DvhORBoA1wDVgDPA58AEY8y54gjQGHMWuNOF+aYD0wHat29v8lvrivSia6a8pSzeUg4ovLKkpafxzIrnWXJmMamxbRnb+GH+1atZsd1JRLeJ5/GWchQGV86x7aKAnUVcdBCo5TRc0x7nMn1sjSoNElMTuffnB1l3fCVpJ7vzUteHGdi2prvDUspjZHvOSkRCRORlEdkhIqdE5KSIbLfHVSyCWNYCDUSkrn27rmGAKw87Pc8Ys8AYMyEkRE+aK+908txJbv3+DtYdW4XvqSF8PvhZTWpKZZJTZ4wvgdNAV2NMZWNMKNANiLWn5ZuIRACrgEYiEiMiY40xacAkrEsLtgNfGmO25nG5/UVkelxcDl3mlSqh9p/Zz83fDiPqzB4qJYxnwR0P0652ZXeHpZTHyakpso4x5hXnEcaYI8DLIpLrOa+cGGOGZzN+MbC4AMvVB40qr7Tx6N+M/fFuklLTaeLzMJ+MG0L5QH93h6WUR8qpxrZfRB4RkfCMESISLiKPAgeKPrS80xqb8kaL9/zCHUvGkJRchhtCX2DOqKGa1JTKQU6JbSgQCvxun2M7BUQClbFur+Vx9Byb8jYfbPicR5c/RGpSVSY3fYupN/fEz1fv+ahUTnLq7n8a6xqyR4svHKUUWNeoPRH5KgujP4dzTXin2+v0aFwr9zcqpfJ3J4+CnmMrKtoUqbxBqiOVUQseYmH05wScu5qvB03XpKZUHuS3TeO5Qo2ikGhTpCrpziTFc+OXo9l4+heqpN7ETyPfpmF4RXeHpVSJktO9IrN75poA4dlMU0rlU3TsYW79bhwJJoaWAROYOeJefYaaUvmQU3f/cKA31rVszgRYWWQRKVUKrYnZxl0/302qSWBA9ad5ofdgfYaaUvmUU2JbCAQbYzZmniAikUUVUEHoLbVUSTRv6zKeW/N/mHQ//tXyLe7scK27Q1KqRMu2ncMYM9YYsyKbabcVXUj5p+fYVEnz2vIvmbJmMuIozztdP9akplQhyPUmyCKS1T174o0xqUUQj1KlgjGGexb8l+WnPiHQ1CViwIc0qKJPu1aqMLjyiOUNWHfdP411fq0icEREjgLjjTHriy48pbxPUmoat3z5BFFpS6ji055vh75LxbJB7g5LKa/hSpern4G+xpgw+0bIN2Cdf7sHmFaUweWVXsemPN3p5BR6fDaeqLQlNAnqy0+3/U+TmlKFzJXEdqUx5seMAWPMT8BVxpg/gYAiiywf9Byb8mQbDx5iStR7nPFdR+9q45g7+GX8/VxpNFFK5YUr36rD9o2P59jDQ4GjIuILpBdZZEp5ke82/81Tfz4EASeZ2OQZ7u14i7tDUspruVJjuw3radbz7b/L7XG+eOjNkJXyJFN/X8KTayYgfgncUfEeTWpKFbFca2zGmBPAfSJS3ho0CU6TdxdZZEqVcOnphru/m84fce8T6FuFWX0/4Pg2j3zik1JeJdcam4i0EJG/gC3AVhFZLyLNiz60vNPOI8pTJKakcuMXT7LyzLtU8WvMj7d+RbOqV7g7LKVKBVeaIj8EHjLG1DbG1Ab+BUwv2rDyRzuPKE8QExtH98/GcSB9Ac2Cr+fH4Z8SWq6iu8NSqtRwJbEFGWN+yxgwxkQC2j9ZqSysid7HjfOGk+D7FzfWmEDEoKmU8S3j7rCUKlVc6RW5V0SeBj6zh0cCe4suJKVKpjkb/+TF9f8Hvud4qNVLjGnTz90hKVUquZLYxmA9f+0be3i5PU4pZfv30q+Yu/9lfKUcb3f7iOvqtHZ3SEqVWq70ijwN3F8MsShV4jgc6YyZ/zrr4z+jnNRmzs0fUq9SdXeHpVSpltODRhcAJrvpxpibiiQipUqIhOQkBs59mCMmkur+HZk35G0qBOjpZ6XcLaca29Rii0KpEmbvyeMMm38P5/x20D5kCDNuegpfH193h6WUIofEZoz5vTgDKQz6oFFVHH7fu537f5uEw/ckw+o8wlPX3e7ukJRSTrLt7i8iuV6r5so8xUmvY1NF7eN1vzApcjTpcpZn2r2lSU0pD5RTU+TNIpKUw3QBuhVyPEp5rMd/+ogFh97BnzCm936fDjUauDskpVQWckpsD7vw/uWFFYhSnirN4WDE11PYdm4+FWjCV0Pep0aFUHeHpZTKRk7n2GYVZyBKeaLTiQkM/GoSJ1lPnTI9+HLIK5T196jHECqlMtGnHCqVjW3HDnD7wokk+xygS+gY3u03GR8fV+5Cp5RyJ01sSmVhyT/reHTFA6TLOcY2eI4Hrxno7pCUUi5yObGJSDljTGJRBqOUJ3jnz/l8uP3f+JhyvHzVh9zYpL27Q1JK5YErz2O7WkS2ATvs4VYiMq3II1OqmBljuG/xm3y44xnKpFfji36zNakpVQK5csLgTaA3cBLAGPM30KUog3ImIvVE5CMRmVdc61SlT1JqCjfPfYDI4x9Tibb8NCyCFpfVcndYSql8cOlMuDEm8/PsHa68T0Q+FpFjIrIl0/g+IrJTRHaLyGO5rHuvMWasK+tTKj+OJJyix+wR7E1eSqOAgfw6cgZhQeXdHZZSKp9cOcd2QESuBoyI+AOTge0uLn8m8C7wacYIEfEF3gN6ATHAWhH5HvAFXsr0/jHGmGMurkupPNtw6B/G/nA3qXKSGy57kNdu0CcyKVXSuZLYJgJvATWAg8BPwL2uLNwYs0xE6mQa3RHYbYzZCyAic4ABxpiXgBtdjFupAvt66+9MWfMIBriv6VTu6tTT3SEppQqBGJPtk2kKZwVWYltojGluDw8B+hhjxtnDtwOdjDGTsnl/KPAiVg1vhp0As5pvAjABIDw8vN2cOXPyFW9CQgLBwcH5eq+n8ZayFEU5vjr8B78nf4WkVmZc2F20qhReqMvPjm4Tz+MtZSmMcnTr1m29MabE95jKtcYmInWB+4A6zvMX1/PYjDEnsWqNuc03HZgO0L59e9O1a9d8rS8yMpL8vtfTeEtZCrMc6SadCQueZ3XK1wSmNSbi5vdoUKVqoSzbFbpNPI+3lMVbylEYXGmKnA98BCwA0gthnQcB5+5mNe1xBaaPrVE5OZOUwC3f3M+h1LVUMV35dsSrhJQt6+6wlFKFzJXElmSMebsQ17kWaGDXBA8Cw4DbCmPBxpgFwIL27duPL4zlKe/xz8kDjFxwF4nE0DZoNB8PehA/X709llLeyJVv9lsi8qyIXCUibTP+XFm4iEQAq4BGIhIjImONMWnAJOBHrN6VXxpjtua7BBevr7+ITI+LiyuMxSkv8dPuNdzy/TAS048x7PIpfHrLvzSpKeXFXKmxtQBuB7pzoSnS2MM5MsYMz2b8YmCxizG6TGtsKrO3//yS/21/CRwVeK7jWwxuWeLPiyulcuFKYrsFqGeMSSnqYApKz7GpDMYY7l38MstPzMbfUY9PbniPVjVqujsspVQxcKU9ZgtQsYjjKBTGmAXGmAkhISHuDkW50dmUc/SbcxfLT8ymUvrV/DhstiY1pUoRV2psFYEdIrIWSM4YWVzd/ZXKi6jYwwybfxcJRNGi7HA+Hfwo/n6+7g5LKVWMXElszxZ5FIVEmyJLt8h9fzE58n4cJDKo5hM832uYu0NSSrlBronNGPN7cQRSGLTzSOn14br5vLv535Bejifavcttra9yd0hKKTfJNrGJyApjzLUiEo/VC/L8JMAYYyoUeXRK5cIYw0M/vskvRz/Bz1Gb6b3fo0Ot2u4OSynlRtkmNmPMtfZ/fX6H8khJqckM/eZf7E36nRBHR74e+ibh5fX3llKlnStP0P7MlXGeQC/QLj0OnjlG99nD2Zv0Ow3LDGbpqOma1JRSgGvd/Zs5D4iIH9CuaMIpGO3uXzqsjN5Cv3m3ciZ9H33DH2HesGcpoz0flVK2nM6xPQ48AZQVkTMZo4EU7LvoK1XcZv61hNc3Po0xAfxfy7cY3b6Lu0NSSnmYnM6xvQS8JCIvGWMeL8aYlLqEMYbHfnmPRQen4+eowfu93uWq2le4OyyllAdypbv/4yJSA6jNxc9jW1aUgeWHXsfmnVLTUxky7yH+SfyF8ult+GrI29SsWNHdYSmlPJQrDxp9GevRMtsAhz3aAB6X2PQ6Nu9zNOEUT+19j0T/PdT1u4m5t02hrL+/u8NSSnkwV+48MhBoZIxJznVOpQrR+oM7GPfTPaT6nqJX2GTe6DsWEXF3WEopD+dKr8i9gP5EVsUqYtMvjP5pFKkmkX6B9/Bmv3Ga1JRSLnGlxpYIbBSRX7n4Jsj3F1lUqlR75rfpfLP/PXwd4bzV7R04cNjdISmlShBXEtv39p/H084jJVuqI5VR859mS8IighwtmDPobepWDiNSE5tSKg9c6RU5qzgCKQzaeaTkOnE2liHf3MPJ9M3U8u3NV8P+Q1BAGXeHpZQqgVzpFbmPi2+CDIAxpl6RRKRKnY2H9zD2h4kkyzGuq3w37/a/W8+nKaXyzZWmyPZOrwOBW4DKRROOKm2+3rqM59Y8QrpJ565GL3Pf1Te4OySlVAnnSlPkyUyj/isi64FniiYkVVq8+PssIva9iY+jMm90eZvrGzZ3d0hKKS/gSlNkW6dBH6wanCs1PaWylOJI4c7vnmVT/ELKOhoTcfN71A+r6u6wlFJewpUE9brT6zQgCqs5Uqk8OxB3hOHf3Uuc+YfqPr2YN+I/lA8MdHdYSikv4kpTZDfnYRHxxbrF1j9FFZTyTj/sXsmjyx/GwTl6Vn2QN/veqZ1ElFKFLts7j4hIBRF5XETeFZFeYpkE7AZuLb4QXacPGvVMxhheWP4hD6+4m3RHGR5vNY3/9hujSU0pVSRyqrF9BpwGVgHjgSexnsc20BizsehDyzu9js3znE05y50LH2F7/DLKpLRg5o1v0KL6Ze4OSynlxXJKbPWMMS0ARGQGcBi43BiTVCyRqRJv16m9jFp4L/HpB6klg4i4/Qkqlg1wd1hKKS+XU2JLzXhhjHGISIwmNeWqb3f8yJQ/nyLN4UPvqk8ytd+t+Pho06NSqujllNhaicgZ+7UAZe1hAYwxpkKRR6dKHEe6g6eXvc6C/Z9hkmvyRLuXGNG+tbvDUkqVItkmNmOMb3EGokq+00mnuWPh/ew7u5EyiVfxyU0v0rJGFXeHpZQqZfRCa1UoNh7dxF0/TeZsWiw100cRMWoylYL0JsZKqeKniU0V2Kdb5jJ13cs40oK5Pux5XuvfDz9fV55hq5RShU8Tm8q3ZEcyDy+dwm+HFpKe2IBH2/2bUZ2auTsspVQp5/GJTURuBvoBFYCPjDE/uTciBXAw4SBjF9/HwXO78D/Ti48GPEmby0PdHZZSSmV/55HCICIfi8gxEdmSaXwfEdkpIrtF5LGclmGMmW+MGQ9MBIYWZbzKNctj/uCmb4YQkxBN9eR7+GH0fzSpKaU8RlHX2GYC7wKfZoyw7zX5HtALiAHWisj3gC/wUqb3jzHGHLNfP2W/T7lJuknnvb8+ZPqm93EkV6VH6CNMvbkHAX7agVYp5TmKNLEZY5aJSJ1MozsCu40xewFEZA4wwBjzEnBj5mWIdUPBl4ElxpgNRRmvyt6ZlDM88OujrD22grT41jzc7inGXN3I3WEppdQlxBhTtCuwEttCY0xze3gI0McYM84evh3oZIyZlM377wfuANYCG40xH2Qz3wRgAkB4eHi7OXPm5CvehIQEgoOD8/VeT1NYZTmUcoj3jvyPuPRTyIl+3Fu3O41Di+/0rG4Tz+Mt5QDvKUthlKNbt27rjTHtCykkt/H4ziPGmLeBt12YbzowHaB9+/ama9eu+VpfZGQk+X2vpymMsizcs5DX/nidlJQAqqU8yKfjhlK9YtnCCdBFuk08j7eUA7ynLN5SjsLgjsR2EKjlNFzTHldgItIf6F+/fv3CWFyplupI5aXVr/LVrjmkJdaha8WHePOOLgT66/k0pZRnc8dVtGuBBiJSV0TKYD209PvCWLAxZoExZkJISEhhLK7UOpZ4jJGLRvPVrjmknrqWyU1fZ9qwrprUlFIlQpHW2EQkAugKhIlIDPCsMeYj+4GlP2L1hPzYGLO1kNanNbYCWndkHZOXPsSZ5LNwYiTTB4yhS0O936NSquQo6l6Rw7MZvxhYXATr0weN5pMxhs+2fcbUda/jSKlM1XMP88md/akTFuTu0JRSKk88vvOIKnqJqYk8teIZfo7+kdT4plxd/l7eHnU1wQG6eyilSh6vOnJpU2TeRcVFcd+vk4k6s4/k4324u/U4JvdoqA8FVUqVWF51C3btPOK6tPQ0PtnyCYO/H0JU7FHSD4/n3b7/4sFejTSpKaVKNK2xlUJbT27l2T+eZefpnaTFNyUseRgfjelJw/Dy7g5NKaUKzKsSm3YeyVliaiLvbXyPz7Z9jqSX59yhkQxo0Jtnb2pGhUB/d4enlFKFwqsSm8re8pjl/PvPFzh89hCO2Ksom3Aj7w/sRK+m4e4OTSmlCpUmNi934twJXl3zKkuillAmvRqJ0RPpXf9KXhjXgspBZdwdnlJKFTqvSmx6ju0CYwyrElbx5PwnOZuaiOPk9aSc6c4bN7fmplbVsR6aoJRS3kd7RXqhqLgoxv40ltknZ+NICufM7vvpUHEoPz/YgwGta2hSU0p5Na+qsZV2qY5UPtn6CR/+/SE+lMFxdBBnEjrxQr/mDO9YSxOaUqpU0MTmJTYe28hzq55jd+xuKtOB6H+up0GFEGZMvo7LQ8u5OzyllCo2XpXYSuM5toSUBN7a8BZzd84lxD8M3+NjORzbiCf7NKJe2n5NakqpUkfPsZVgS6OXMuC7AczdOZeavr04sGUStQLas+i+axnXuR4+2vSolCqFvKrGVlocSzzGS6tf4pfoX6hRrh5ljt3GP6er8WD3BtzT7Qr8fb3q94pSSuWJJrYSJN2k89XOr/jvhv+Smp5Kk4BhrFnfggZVQ/jknta0qFk6aqpKKZUTTWwlxJ7YPUxZOYWNxzfSpGI7Du7uy9oTQdzVpR4P9mqoT7dWSimbVyU2b+w8kuxIZsbmGczYPIMg/2CuLH8vv/xZk1qVgvjyrlZ0qFPZ3SEqpZRH8arE5m03QV53ZB3PrXqOqDNRXHtZb/7Z1pWfjwojOl3OE32bEKQPAlVKqUvokdEDxSXH8eb6N/l619fUCK5B79Cnmf97MGHBAcwa05LrGlZxd4hKKeWxNLF5EGMMP+7/kZdXv0xsciw31x3Bhr87MO9gEgPbVGdK/2aElNPHyyilVE40sXmIwwmHeWH1CyyLWUbTyk3pVflJZv2URvmAdD4Y2ZY+zau5O0SllCoRNLG5kSPdwdqja1m8dzE/RP0AwLimD7BifSP+FxXH9U3D+c+gFoQFB7g5UqWUKjk0sRUzYwzbTm1j0d5F/LDvB46fO045v3L0qt2L6mYA7y04ha/PWd64tRUD2+id+JVSKq80sRWT/Wf2s3jfYhbvXUzUmSj8fPzoXKMzfev1papPW/77SxRf/HOczg3CeGVwS6pXLOvukJVSqkTyqsTmadexnTh3gh/2/cCivYvYcnILgtD+svbc0ewOutXsycpdicxYEsW6/WsJKuPLvwc0Y+SVtbWWppRSBeBVic0TrmOLT4nn1+hfWbx3MauPrCbdpNOkchP+1e5f9KnbBz9TiYjV0fSdt46jZ5KpHVqOp29sypB2NQkpqz0elVKqoLwqsblLiiOF5THLWbRvEb8f+J2U9BRqBtdkXItx9Kvbj3oV67EpJpZXF0Wx8O+/SHGk06VhFV4aVJuuDavi46M1NKWUKiya2PLJke5g3dF1LN63mJ+jfiY+NZ7KgZUZ0nAI/er1o0VYC1IdhiVbDvOvlX/wV3QsQWV8Gd6xFqOursMVVYLdXQSllPJKmtjywBjD9lPbz/doPHbuGOX8ytGzdk/61u1Lp2qd8PPx41h8Em/9uosvVkdzPD6ZumFBPNvfam4sH6jNjUopVZQ0sbkg+kw0i/YtuqRH48P1Hua6mtdR1s/qwfhX9GlmrYxi0ebDpDoMXRtVYfTVdejSoIo2NyqlVDHRxJaNjB6Ni/ctZvOJzRf1aOxVuxchAdazz5LTHHz7VwwzV+7n7wOxBAf4MfLK2oy6qg51w4LcXAqllCp9NLE5SUhJYHXCamb/NPt8j8bGlRuf79F4WdBl5+c9eiaJL1ZHM3t1NCcSkqlXJYjnBzRjUNuaBOtd95VSym30COzknl/v4a+Tf53v0di3bl+uqHjF+enGGDZExzJzZRRLNh/GYQzdG1XljqvrcG39MG1uVEopD+DxiU1EmgCTgTDgV2PM+0W1rkmtJ7F101ZGXz/6ooukk9McLPz7MDNXRrH5YBzlA/244+o6jLqqNrVDtblRKaU8SZEmNhH5GLgROGaMae40vg/wFuALzDDGvJzdMowx24GJIuIDfAoUWWLrWK0jiTsTzye1I3FJfP7nfiLWRHPybAr1qwbz75ubM6hNDX3Ip1JKeaiiPjrPBN7FSkgAiIgv8B7QC4gB1orI91hJ7qVM7x9jjDkmIjcBdwOfFXG8GGNYG3WKmSuj+GHLEdKNoUfjcO68pg5XXxGqt7tSSikPV6SJzRizTETqZBrdEdhtjNkLICJzgAHGmJewandZLed74HsRWQTMLqp4v9kQw1urktj/4yoqBPox5po63H5lHS4PLVdUq1RKKVXIxBhTtCuwEtvCjKZIERkC9DHGjLOHbwc6GWMmZfP+rsAgIADYZIx5L5v5JgATAMLDw9vNmTMnz7FO25jEgTNp9K4bwFXV/AjwK9m1s4SEBIKDS/4dTrylHOA9ZfGWcoD3lKUwytGtW7f1xpj2hRSS23j8iSJjTCQQ6cJ804HpAO3btzddu3bN87raX5XG2pXL6datW57f64kiIyPJz+fgabylHOA9ZfGWcoD3lMVbylEYfNywzoNALafhmva4AhOR/iIyPS4uLl/vDw7w03NoSilVwrkjsa0FGohIXREpAwwDvi+MBRtjFhhjJoSEhBTG4pRSSpVARZrYRCQCWAU0EpEYERlrjEkDJgE/AtuBL40xWwtpfQWqsSmllCr5irpX5PBsxi8GFhfB+tz+oFGllFLu5Y6mSKWUUqrIeFVi06ZIpZRSXpXYtPOIUkopr0psWmNTSilV5HcecQcRiQN2OY0KAeJcfB0GnMjnqp2Xl9d5shqfeVxOwxmvnceVlLJ46jbJappuE8/bJlmNyy3+krhNnIcLe5tkLKeiMaZKAZbhGYwxXvcHTM9uOLfXwLrCWm9e5slqfE7lyCF+53Eloiyeuk3yug10m7hnm+SnLCVxm+QQf4G3iatlKSl/XtUU6WRBDsOuvC6s9eZlnqzG51SOzMMLspknv4qzLJ66TbKaptuk4Ap7m2Q1Lrf4S+I2cR4u7G1SmMtxO69siiwIEVlnvOAmoOA9ZfGWcoD3lMVbygHeUxZvKUdh8NYaW0FMd3cAhchbyuIt5QDvKYu3lAO8pyzeUo4C0xqbUkopr6I1NqWUUl5FE5tSSimvoolNKaWUV9HElgsRCRKRWSLyPxEZ4e548ktE6onIRyIyz92xFJSI3Gxvj7kicr2748kvEWkiIh+IyDwRudvd8RSU/V1ZJyI3ujuW/BKRriKy3N4uXd0dT0GIiI+IvCgi74jIHe6OpziVysQmIh+LyDER2ZJpfB8R2Skiu0XkMXv0IGCeMWY8cFOxB5uDvJTDGLPXGDPWPZHmLo9lmW9vj4nAUHfEm508lmO7MWYicCtwjTvizUkevycAjwJfFm+UuctjOQyQAAQCMcUda27yWJYBQE0gFQ8sS5Fy9xXi7vgDugBtgS1O43yBPUA9oAzwN9AUeBxobc8z292x57ccTtPnuTvuQizL60Bbd8dekHJg/VhaAtzm7tgLUhagFzAMGA3c6O7YC1AOH3t6OPCFu2MvYFkeA+6y5/HI731R/ZXKGpsxZhlwKtPojsBuY9VsUoA5WL94YrB+9YCH1XDzWA6PlpeyiOUVYIkxZkNxx5qTvG4TY8z3xpgbAI9r5s5jWboCVwK3AeNFxGO+K3kphzEm3Z5+GggoxjBdko9j12l7HkfxRel+RfoE7RKmBnDAaTgG6AS8DbwrIv0oGbecybIcIhIKvAi0EZHHjTEvuSW6vMlum9wH9ARCRKS+MeYDdwSXB9ltk65YTd0BFMET5YtIlmUxxkwCEJHRwAmnBOGpstsmg4DeQEXgXTfElR/ZfU/eAt4Rkc7AMncE5i6a2HJhjDkL3OnuOArKGHMS65xUiWeMeRvrB0eJZoyJBCLdHEahMsbMdHcMBWGM+Qb4xt1xFAZjTCLgsefVi5LHNBd4gINALafhmva4ksZbygHeUxZvKQd4T1m8pRzgXWUpFJrYLlgLNBCRuiJSButE+Pdujik/vKUc4D1l8ZZygPeUxVvKAd5VlsLh7t4r7vgDIoDDXOgGO9Ye3xf4B6uH0ZPujrO0lMObyuIt5fCmsnhLObytLEX5pzdBVkop5VW0KVIppZRX0cSmlFLKq2hiU0op5VU0sSmllPIqmtiUUkp5FU1sSimlvIomNqWUUl5FE5sqFUQkoQDvnWQ/58qISJjTeBGRt+1pm0SkrdO0aiKysKBxFzYRmSoi3d0dh1JFSRObUrn7A+tpAvszjb8BaGD/TQDed5r2EPC/gq5YRHwLuoxM3sF6TpdSXksTmypV7FrWayKyRUQ2i8hQe7yPiEwTkR0i8rOILBaRIQDGmL+MMVFZLG4A8Kmx/AlUFJFq9rTBwA/2skeLyDci8oOI7BKRV3OJMUFEXheRv4GrROQhO94tIvKAPc/DInK//fpNEVlqv+4uIl+IiK+IzHQq54N2WfYDoSJyWYE+SKU8mCY2VdoMAloDrbBqYa/ZyWgQUAfrycO3A1e5sKysnoNVQ0TqAqeNMclO01oDQ4EWwFARcb4be2ZBwGpjTCvgHNZjkzphPchzvIi0AZYDne352wPBIuJvj1tmr6+GMaa5MaYF8InT8jcA17hQPqVKJE1sqrS5FogwxjiMMUeB34EO9vivjDHpxpgjwG8FWEc14Himcb8aY+KMMUnANqB2Du93AF87xfutMeasMSYB61lhnYH1QDsRqQAkA6uwElxnrKS3F6gnIu+ISB/gjNPyjwHVC1A+pTyaJjal8i+752CdAwIzzetce3OQ80N+k4wxjpxWbIxJBfYBo4GVWMmsG1Af2G6MOY1VK43EesDsDKe3B9oxKuWVNLGp0mY5VlOgr4hUAboAa7A6iAy2z7WFA11dWNb3wCj7vN2VQJwx5jDW40PqFGK8N4tIOREJAgba4zKm/R9W0+NyrAT2lzEmo/emjzHma+ApoK3TMhsCWwopPqU8Tk6/GpXyRt9inT/7GzDAI8aYIyLyNdADq5nwANZ5qDgAu5PGI8BlwCYRWWyMGQcsxnoO1m4gEetcGMaYsyKyR0TqG2N2FyRYY8wGEZmJlXwBZhhj/rJfLweeBFbZ60ziQtKrAXwiIhk/Xh+3y+KPVatbV5C4lPJk+jw2pWwiEmyMSRCRUKxEco19vi0/yxoItDPGPFWoQRaQHVdbY8zT7o5FqaKiNTalLlgoIhWBMsC/85vUAIwx39oJ0tP4Aa+7OwilipLW2JRyExFZDQRkGn27MWazO+JRyltoYlNKKeVVtFekUkopr6KJTSmllFfRxKaUUsqraGJTSinlVTSxKaWU8ir/D+ahWBWiE78RAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "vectorized_comparison.xlabel = 'log10(n_rows)'\n",
    "vectorized_comparison.title = 'GroupBy Apply Aggregation Function Speed Comparison [LogLog Plot]'\n",
    "vectorized_comparison.plot(logx=True, logy=True, time_unit='s')\n",
    "plt.ylabel(\"Runtime [log10(s)]\")\n",
    "plt.savefig(\"groupby_apply_agg_func_speed_comparison_loglog.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Groupby Apply text function speed comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "SIZE = 100000000\n",
    "data = pd.DataFrame({\n",
    "    \"groups\": np.random.choice(np.arange(100000), size=SIZE),\n",
    "    \"first\": np.random.choice([\"JACK\", \"JILL\"], size=SIZE),\n",
    "    \"last\": np.random.choice([\"SMITH\", \"JOHNSON\"], size=SIZE),\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0% 0/10 [00:00<?, ?it/s]\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:00,  3.45it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:01<00:00,  1.11it/s]\u001b[A\n",
      "100% 3/3 [00:02<00:00,  1.39it/s]\u001b[A\n",
      " 10% 1/10 [00:02<00:19,  2.13s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.66it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:01<00:01,  1.03s/it]\u001b[A\n",
      "100% 3/3 [00:02<00:00,  1.21it/s]\u001b[A\n",
      " 20% 2/10 [00:04<00:18,  2.36s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.39it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:02<00:01,  1.22s/it]\u001b[A\n",
      "100% 3/3 [00:02<00:00,  1.06it/s]\u001b[A\n",
      " 30% 3/10 [00:07<00:18,  2.62s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.12it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:02<00:01,  1.56s/it]\u001b[A\n",
      "100% 3/3 [00:03<00:00,  1.17s/it]\u001b[A\n",
      " 40% 4/10 [00:11<00:18,  3.02s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.06it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:03<00:01,  1.70s/it]\u001b[A\n",
      "100% 3/3 [00:04<00:00,  1.32s/it]\u001b[A\n",
      " 50% 5/10 [00:15<00:16,  3.40s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.01it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:03<00:02,  2.11s/it]\u001b[A\n",
      "100% 3/3 [00:04<00:00,  1.55s/it]\u001b[A\n",
      " 60% 6/10 [00:20<00:15,  3.86s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:00<00:01,  1.03it/s]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:04<00:02,  2.51s/it]\u001b[A\n",
      "100% 3/3 [00:05<00:00,  1.82s/it]\u001b[A\n",
      " 70% 7/10 [00:25<00:13,  4.42s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:01<00:03,  1.89s/it]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:05<00:03,  3.02s/it]\u001b[A\n",
      "100% 3/3 [00:06<00:00,  1.88s/it]\u001b[A\n",
      " 80% 8/10 [00:31<00:09,  5.00s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:05<00:11,  5.91s/it]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:10<00:05,  5.12s/it]\u001b[A\n",
      "100% 3/3 [00:11<00:00,  3.47s/it]\u001b[A\n",
      " 90% 9/10 [00:43<00:07,  7.19s/it][A\n",
      "  0% 0/3 [00:00<?, ?it/s]\u001b[A\n",
      " 33% 1/3 [00:11<00:22, 11.32s/it]\u001b[A/tmp/ipykernel_31702/386866890.py:5: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.\n",
      "  Before: .apply(func)\n",
      "  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result\n",
      "  or:     .apply(func, meta=('x', 'f8'))            for series result\n",
      "  lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
      "\n",
      " 67% 2/3 [00:17<00:08,  8.12s/it]\u001b[A\n",
      "100% 3/3 [00:22<00:00,  7.39s/it]\u001b[A\n",
      "100% 10/10 [01:06<00:00,  6.60s/it]\n"
     ]
    }
   ],
   "source": [
    "vectorized_comparison = perfplot.bench(\n",
    "    setup=lambda n: data.iloc[:n],\n",
    "    kernels=[\n",
    "        lambda df: df.groupby(\"groups\").apply(join_text_func),\n",
    "        lambda df: dd.from_pandas(df, npartitions=npartitions).groupby(\"groups\").apply(join_text_func).compute(scheduler=\"processes\").sort_values(ascending=False),\n",
    "        lambda df: df.swifter.progress_bar(False).groupby(\"groups\").apply(join_text_func),\n",
    "    ],\n",
    "    labels=['Pandas Apply', 'Dask Apply', 'Swifter Apply'],\n",
    "    n_range=[2**k for k in range(0, 20, 2)],\n",
    "    xlabel='n_rows',\n",
    "    equality_check=None\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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UqpfrdWXA4nm79eBJOBeR9ngaKpn4Kruznnttddyzz33AHDrrbcyb9483njjDWbOnElAQABgNMRWT10YGBhYw63i6enJmjVruOyyywgKCuLWW2+1bVuzZg333lvzVM2bN481a9Ywf/58xo8fz+23387evXuZNm2arYE2ICCAjRs38thjj9GzZ0/efvvtOsuyaNEijh49yvDhw1v1HAmCo3CVuDnOQBmROx2UuCH8n9i5egq11sHmbwWcqF6u49jlwHKA0NDQaPteLABdunRh0KBBjdrQ3Dl3OxIbNmzgr3/9q61mb094eDg5OTmNpvGrX/2KsWPHsmTJkhbbs3fvXoqKilqcTl2UlJQQGBjokLTbE1LO+jlYVMW3WZWkHKmkwgqDgj04v683MaGe+Hi2T9+9s67ntGnT0rXWMbXXO82Zq7XWSql6/3W01iuBlQAxMTE6MTGxxvadO3c2yXfvyKkX2wv+/v4opeotZ2Plj46OJiAggOeff77G9JDNxdfXl3HjxrU4nbpISkqi9r3gikg5a1Izbs4p/Lw9mRfTp8PEzWlv17OthT9PKRWutc5RSoUD+W2cv0uSmJho691Tm6aMBk5PT29tkwShVXCHuDnOoK2F/z/AdcCT5vdHbZy/IAjtHHeLm+MMHNmdcw1GQ26IUiobeBhD8N9RSt0AHAKudlT+giB0LNw1bo4zcGSvnoX1bJI5+wRBAIyumOmHjrt13BxnICN1BEFoc06druSjjCP8/Ydysr5IJqiTF9fE9WVxfF8G9XTtzhjtAfk7bQGPP/44I0eOZMyYMURFRZGamtqk4x566CG+/vprwOiKOXLkSKKiokhOTuazzz5rFds+/PBDlFLs2rWrReksXbq0zm6igtAc9uQV8/BH24n/wzfc/+9tKOCJK0aT+vvprLhspIh+GyE1/maSnJzMJ598wubNm+nUqRPHjh2joqKiScc++uijtt9vvvkm9913H4sXL+a1114jLS2NSy65pMl2VFZW1hliQcI3C+2FhuLmnNyfwbQJfZ1totshNf5mkpOTQ0hIiK3fe0hICL169WLTpk22QGgfffQRfn5+VFRUUF5ebguiVl2Lfumll3jnnXd48MEHWbhwIQ899BBvv/02UVFRvP3225w6dYply5YxYcIExo0bx0cfGZ2gXnvtNS677DLOP/98pk8/u8mkofDNCQkJ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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "vectorized_comparison.title = \"GroupBy Apply Text Function Speed Comparison\"\n",
    "vectorized_comparison.xlabel = \"n_rows\"\n",
    "vectorized_comparison.plot(logx=False, logy=False)\n",
    "plt.savefig(\"groupby_apply_text_func_speed_comparison.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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b71FUFAQ8fHxpdpOVFQUK1euLJOYXEmTjipzmdmZTF03laHzhnLg1CGqxI9i09prGHVxG74fdwmt6rplVAylAKhUqRJr1qxh/fr1VKhQgQ8+yHdILo+Jjo6ma9euzJ4929OhuIUmHVWmdsbvZMRPI3h79ds0qNiFI5vuITupLV+O6saEq1vrvTfKo3r06MH27duZO3cu3bp1o2PHjvTp04cjR44AVg3mtttuIyoqiiZNmvDOO6eH8nrhhRdo3rw53bt3Z8uWLbnzP/roI7p27Ur79u0ZNGhQbk3qm2++oW3btrRv356ePXvmG8+OHTtITEzk+eefJzo6Onf+9OnTufbaa4mKiqJZs2Y888wzAOzevZuWLVty44030qpVKwYPHnxWzW3atGncf//9Z8T3wAMPlO6FK0M+dU1HGxJ4TlZ2Fl9s+oJ3Vr9DRf8g6qSOYu2mpvRvX0+bQisAnpm7gY0HE4pcLysrC39/536ctK5XhaevaePUupmZmfz000/069eP7t278/fffyMiTJ06lVdffZVJkyYBsHnzZhYtWsSpU6do0aIFd955J2vXrmXmzJmsWbOGzMxMOnXqROfOnQG47rrrGD3auow8YcIEPv74Y+655x6effZZFixYQP369YmLi8s3ppkzZzJs2DB69OjBli1bOHLkCOHh1ii4y5cvZ/369QQHB9O1a1euuuoqatasyZYtW/j444+55JJLuO2223j//fd58MEHc7d5/fXX88ILL/Daa68RGBjIJ598wocffujUa+QOPlXT0W5wPGNPwh5uXXArr698nYiQTsRvu4/Dh1ry9rAOvDO8oyYc5VEpKSl06NCBLl260KhRI26//Xb2799P3759adeuHa+99hobNpweXeWqq66iYsWK1KxZk9q1a3PkyBGWLFnCwIEDCQ4OpkqVKvTv3z93/fXr19OjRw/atWvHjBkzcrd1ySWXMHLkSD766COysrLyjS06Opphw4bh5+fHoEGD+Oabb3KXXX755dSoUYNKlSpx3XXXsXTpUgAaNmzIJZdcAsBNN92UOz9HaGgol112GfPmzWPz5s1kZGTQrl27snkxy4BP1XSUe2WbbKI3R/PWqrcI8AukKaNZtbwJFzapwaTrO2hTaHUGZ2skZX3zZM41HUf33HMP48ePp3///sTExDBx4sTcZRUrVsx97O/vT2ZmZqHb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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "vectorized_comparison.xlabel = 'log10(n_rows)'\n",
    "vectorized_comparison.title = 'GroupBy Apply Text Function Speed Comparison [LogLog Plot]'\n",
    "vectorized_comparison.plot(logx=True, logy=True, time_unit='s')\n",
    "plt.ylabel(\"Runtime [log10(s)]\")\n",
    "plt.savefig(\"groupby_apply_text_func_speed_comparison_loglog.png\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
